我似乎无法让我的visibilty转换器工作。我认为问题是我在构造函数中设置了相关的属性,因此它不会在线上捡起它。代码如下,有关我如何解决此问题的任何建议?
MainWindowViewModel :(这是主页;点击按钮会打开第二个窗口)
var newWindow = new SecondaryWindow
{
Title = title,
DataContext = new SecondaryWindowViewModel{MyData = data, ShowAdditionalColumns = false}
};
newWindow.Show();
辅助窗口: 这是相关的XAML:
<Window.Resources>
<myApp:DataGridVisibilityConverter x:Key="gridVisibilityConverter" />
</Window.Resources>
<DataGrid ItemsSource="{Binding Path=MyData}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Print" Binding="{Binding Path=IsSelected}"/>
<DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" IsReadOnly="True"/>
<DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}" IsReadOnly="True"/>
<DataGridTextColumn Header="Lines" Binding="{Binding Path=TotalLines}" IsReadOnly="True" Visibility="{Binding Path=ShowAdditionalColumns, Converter={StaticResource gridVisibilityConverter}}"/>
辅助ViewModel代码:
private bool showAdditionalColumns;
public bool ShowAdditionalColumns
{
get { return showAdditionalColumns; }
set
{
showAdditionalColumns= value;
NotifyPropertyChanged(() => ShowAdditionalColumns);
}
}
这是转换器;很标准的东西在这里。我在转换方法中加了一个断点;并且它永远不会被击中:
[ValueConversion(typeof(bool), typeof(Visibility))]
public class DataGridVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var booleanValue = (bool)value;
return booleanValue ? Visibility.Visible : Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
答案 0 :(得分:0)
DataGrid
的列不是可视/逻辑树的一部分,因此它们不会获得DataContext
继承。如果您调试程序,您将在输出窗口中看到错误:
System.Windows.Data错误:2:找不到管理FrameworkElement或 目标元素的FrameworkContentElement。
这里有一些选择。
引用一些具有适当数据上下文的控件。最简单的方法是使用根容器(例如用户控件)。
首先在代码中初始化名为“This”的资源(必须在InitializeComponent
之前调用):
public MyUserControl()
{
Resources["This"] = this;
InitializeComponent();
}
然后在XAML中引用它:
<DataGridTextColumn Visibility="{Binding Source={StaticResource This},
Path=DataContext.ShowAdditionalColumns,
Converter={StaticResource gridVisibilityConverter}}" />
(作为旁注,您为列的数据提供的绑定有效,因为它被复制到网格中的行,其中数据上下文由DataGrid
设置为数据项。)