【问题标题】:WPF DataGrid bindingWPF 数据网格绑定
【发布时间】:2011-09-28 22:07:07
【问题描述】:

我有一个 UserControl,它的 DataContext 设置为另一个名为 HostConext 的类。

在 HostContext 我有以下属性:

public Visibility IsOutcomesVisible
{
  get { return _isOutcomesVisible; }
  set { _isOutcomesVisible = value; OnPropertyChanged("IsOutcomesVisible"); }
}

我的 XAML 包含如下所示的 DataGrid:

<dg:DataGrid Grid.Row="0" ItemsSource="{Binding Path=Payments}">
  <dg:DataGrid.Columns>
    <dg:DataGridTextColumn Header="Payment Date" Binding="{Binding PaymentDate,StringFormat={}\{0:yyyy/MM/dd\}}"/>
    <dg:DataGridComboBoxColumn Header="Outcome" SelectedItemBinding="{Binding Outcome}" 
        Visibility="{Binding Path=DataContext.IsOutcomesVisible}">
      ....
    </dg:DataGridComboBoxColumn>
  </dg:DataGrid.Columns>
</dg:DataGrid>

数据网格的 ItemSource 设置为 Payment 对象的 ObservableList,并且每一列都绑定其中的属性。但是,问题是我需要根据 UserControl 的 DataContext 中的属性隐藏(或禁用)Outcomes 列。

这里有人知道如何实现吗?我真的不想将“IsOutcomesVisible”属性放在 Payments 类中:(

【问题讨论】:

  • 上面的代码对我来说还可以吗?在绑定中使用 DataContext.IsOutcomesVisible 时它不起作用吗?
  • 不关注。如果你的意思是 Visibility="{Binding DataContext.IsOutcomesVisible},不 :(
  • 使用下面的答案有什么运气吗?
  • @NickHeidke 在下面看到我的回答

标签: wpf datagrid binding


【解决方案1】:

尝试使用 Josh Smith 的 DataContextSpy 为您的 DataGridColumn 引入人工继承上下文

http://blogs.infragistics.com/blogs/josh_smith/archive/2008/06/26/data-binding-the-isvisible-property-of-contextualtabgroup.aspx

public class DataContextSpy
    : Freezable // Enable ElementName and DataContext bindings
{
    public DataContextSpy()
    {
        // This binding allows the spy to inherit a DataContext.
        BindingOperations.SetBinding(this, DataContextProperty, new Binding());
    }

    public object DataContext
    {
        get { return (object)GetValue(DataContextProperty); }
        set { SetValue(DataContextProperty, value); }
    }

    // Borrow the DataContext dependency property from FrameworkElement.
    public static readonly DependencyProperty DataContextProperty =
        FrameworkElement.DataContextProperty.AddOwner(typeof(DataContextSpy));

    protected override Freezable CreateInstanceCore()
    {
        // We are required to override this abstract method.
        throw new NotImplementedException();
    }
}

因此,您将其中之一添加到控件/页面/窗口的资源字典中,如下所示:

<UserControl.Resources>
     <misc:DataContextSpy x:Key="Spy" />
</UserControl.Resources>

现在您可以通过 StaticResourceExtension 引用 spy 以获取控件/页面/窗口的数据上下文

 Visibility="{Binding 
                 Source={StaticResource Spy}, 
                 Path=DataContext.IsOutcomesVisible}"

【讨论】:

  • 这不是我的问题,我过去这样做只是在这里为您提供支持!
  • @Wegged 哎呀! - 谢谢。你和 OP 碰巧有同一个代表,不知怎的,我把你搞混了
【解决方案2】:

将您的可见性绑定更改为:

Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.IsOutcomesvisible}"

Similar Question

【讨论】:

  • 不工作:(我在设置器上设置了一个断点,它肯定设置为隐藏,但代码从未到达获取。我确实将 DataGrid 部分修复为 dg:DataGrid 和 IsOutcomesvisible到 IsOutcomesVisible。没有。
  • 您可以尝试将 AncestorType={x:Type DataGrid}} 更改为指向最高级别的容器吗?也许是 StackPanel 或 Grid?
  • Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type Grid}}, Path=DataContext.IsOutcomesVisible}"> -- 也不起作用
【解决方案3】:

如果您的视图中有多个 DataGrid,RelativeSource 可能会很棘手,这样怎么样:

Visibility="{Binding ElementName=windowMain, Path=DataContext.IsOutcomesVisible}

确保在分配初始 DataContext 的位置命名窗口或控件

【讨论】:

  • 我试过这个。没有运气。我应该将它与上述答案结合使用吗?
  • 您能否确保您提供的 ElementName 与您在初始化时附加 DataContext 的元素相同。做了简单的测试,它适用于我的情况
  • 我添加了 并在它的构造函数中 this.DataContext = myContext;编辑:我也尝试使用 Name 而不是 x:Name。
  • 能否请教输出窗口是否有任何错误,通常会显示任何绑定错误
  • 输出:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement
【解决方案4】:

这个答案更类似于 NickHeidke 的答案,我刚刚添加了“Mode=FindAncestor” 在 X:Type 中使用 dg:DataGrid

Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type dg:DataGrid}}, Path=DataContext.IsOutcomesvisible}"

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2012-07-03
    • 2013-11-14
    • 2011-08-14
    相关资源
    最近更新 更多