WPF可见性转换器未触发

时间:2014-02-12 13:27:16

标签: wpf converter ivalueconverter

我似乎无法让我的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();
    }
}

1 个答案:

答案 0 :(得分:0)

DataGrid的列不是可视/逻辑树的一部分,因此它们不会获得DataContext继承。如果您调试程序,您将在输出窗口中看到错误:

  

System.Windows.Data错误:2:找不到管理FrameworkElement或   目标元素的FrameworkContentElement。

这里有一些选择。

  • 使用此解决方案:http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx
  • 引用一些具有适当数据上下文的控件。最简单的方法是使用根容器(例如用户控件)。

    首先在代码中初始化名为“This”的资源(必须在InitializeComponent之前调用):

    public MyUserControl()
    {
        Resources["This"] = this;
        InitializeComponent();
    }
    

    然后在XAML中引用它:

    <DataGridTextColumn Visibility="{Binding Source={StaticResource This},
                        Path=DataContext.ShowAdditionalColumns,
                        Converter={StaticResource gridVisibilityConverter}}" />
    

(作为旁注,您为列的数据提供的绑定有效,因为它被复制到网格中的行,其中数据上下文由DataGrid设置为数据项。)