根据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的布尔值。
但是这个代码不起作用。
由于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了