WPF可见性转换器未触发 [英] WPF Visibility Converter not Firing

查看:338
本文介绍了WPF可见性转换器未触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎无法让我的可见性转换器正常工作。我认为问题在于我在构造函数中设置了相关属性,因此它没有沿线使用。代码在下面,关于如何解决此问题的任何建议?

I can't seem to get my visibilty converter to work. I think the issue is that i'm setting the relevant property in the constructor, so it's not picking it up down the line. Code is below, any suggestions as to how I can fix this?

MainWindowViewModel :(这是主页;单击按钮将打开第二个窗口)

MainWindowViewModel: (this is the main page; clicking a button will open a second window)

var newWindow = new SecondaryWindow
                {
                    Title = title,
                    DataContext = new SecondaryWindowViewModel{MyData = data, ShowAdditionalColumns = false}
                };
newWindow.Show();

次要窗口:
这是相关的XAML:

Secondary Window: Here's the relevant 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}}"/>

和次要视图模型代码:

private bool showAdditionalColumns;
public bool ShowAdditionalColumns
{
    get { return showAdditionalColumns; }
    set
    {
        showAdditionalColumns= value;
        NotifyPropertyChanged(() => ShowAdditionalColumns);
    }
}

这里是转换器;非常标准的东西。我在convert方法中设置了一个断点;并且永远不会被击中:

Here's the converter; pretty standard stuff here. I've put a breakpoint in the convert method; and it's never hit:

[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();
    }
}


推荐答案

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

The DataGrid's columns are not part of the visual/logical tree, so they don't get the DataContext inheritance. If you debug the program, you'll see the error in the output window:


System.Windows.Data错误:2:找不到

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element.

这里有一些选择。

  • Use this solution: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx
  • Reference some control that does have an appropriate data context. It's easiest to use the root container (e.g. user control).

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

First initialize a resource named "This" in code (must be called before InitializeComponent):

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

然后在XAML中引用它:

Then reference it in XAML:

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


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

(As a side note, the binding you provide for the column's data works because it is copied to the row in the grid, where the data context is set by the DataGrid to the data item.)

这篇关于WPF可见性转换器未触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆