【问题标题】:WPF Visibility Converter not FiringWPF 可见性转换器未触发
【发布时间】:2014-02-12 13:27:16
【问题描述】:

我似乎无法让我的能见度转换器工作。我认为问题在于我在构造函数中设置了相关属性,所以它并没有把它捡起来。代码如下,有什么建议可以解决这个问题吗?

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

这是转换器;这里很标准的东西。我在 convert 方法中放了一个断点;而且它从未被击中:

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

【问题讨论】:

  • 请显示可见性转换器的代码。
  • 由于在设置属性时对象尚未完全构造,因此无法监听属性更改事件。一些疯狂的想法: ShowAdditionalColumns 不能成为 Dependency 属性是否有原因?我相信这会解决问题。或者您可以为 SecondaryWindow 的 DataContextChanged 事件设置处理程序并在处理程序中设置属性...
  • 输出窗口有什么抱怨吗?其他DataGridTextColumns绑定正确吗?
  • NotifyPropertyChanged(() =&gt; ShowAdditionalColumns); 它的作用.. 显示PropertyChanged 实现..

标签: wpf converter ivalueconverter


【解决方案1】:

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 设置到数据项。)

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2013-08-18
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多