根据ViewModel返回的属性设置DataGridTextColumn的可见性.遵循MVVM Caliburn

本文关键字:遵循 可见性 MVVM Caliburn DataGridTextColumn 设置 ViewModel 返回 属性 根据 | 更新日期: 2023-09-27 18:18:12

根据ViewModel返回的属性设置DataGridTextColumn的可见性。我在View

中添加了下面的代码
xmlns:shared="clr-namespace:IKEA.CountryRange.Local.Shared"
<Window.Resources><shared:VisibilityConverterx:Key="BoolToVisibilityConverter"></shared:VisibilityConverter>
</Window.Resources>
<DataGridTextColumn Header="Price" Width="auto" Visibility="{Binding _ViewPurchasePrices, Converter={StaticResource BoolToVisibilityConverter}}"/>

在共享文件夹中创建一个类

public class VisibilityConverter : IValueConverter
    {
        #region IValueConverter Members
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var v = value;
            if (v == "true")
                return "Visible";
            else
                return "Collapsed";
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
        #endregion
    }
}

在ViewModel中,我已经绑定了Property的布尔值。

但是这个代码不起作用。

根据ViewModel返回的属性设置DataGridTextColumn的可见性.遵循MVVM Caliburn

由于DataGridTextColumn或任何其他支持的数据网格列不是数据网格可视化树的一部分,因此它们不继承数据网格/窗口的DataContext。因为,它们不在可视树中,所以使用RelativeSource获取DataContext的任何尝试都将不起作用。

你可以创建一个代理元素来绑定用户控件/窗口的数据上下文;使用代理元素绑定DataGridTextColumn的可见性。例如:

 <Grid>
       <Grid.Resources>
           <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"></FrameworkElement>
       </Grid.Resources>
       <ContentControl Visibility="Collapsed" Content="{StaticResource ProxyElement}"></ContentControl>
       <DataGrid>
           <DataGrid.Columns>
                <DataGridTextColumn Visibility="{Binding Source={StaticResource ProxyElement}, Path=DataContext._ViewPurchasePrices, Converter={StaticResource BoolToVisibilityConverter}}"></DataGridTextColumn>
                </DataGrid.Columns>
       </DataGrid>
    </Grid>
var v = value as bool?; // null if not a boolean
if (v == true)
    return Visibility.Visible;
else
    return Visibility.Collapsed;

为什么不绑定DataGridTextColumn的可见性属性?那么你就不需要Converter了