【问题标题】:Losing DataContext when using Datagrid in UserControl在 UserControl 中使用 Datagrid 时丢失 DataContext
【发布时间】:2018-06-11 15:27:47
【问题描述】:

考虑一下这个 XAML:

<UserControl>
    <TextBlock Text="{Binding NestedObject.Name}" TextWrapping="Wrap"/>
    <DataGrid DataContext="{Binding}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding NestedObject.Name}" />
        </DataGrid.Columns>
    </DataGrid>
</UserControl>

TextBlock 的情况下,对象属性会正确显示,但在DataGrid 中使用它时,不会显示任何内容。

这很奇怪,因为我在两种情况下都以相同的方式调用它,并且我认为当没有指定数据上下文时,它会回退到父数据上下文。

我在声明中遗漏了什么吗?

注意

我在 MainWindow 中使用UserControl,并将一个具有 NestedObject 属性的对象分配给它的数据上下文。此外,Name 正在实现 INotifyPropertyChanged

【问题讨论】:

  • 如果 UserControl 的 DataContext 中有 SomeObject 的实例,Binding SomeObject.Name 将不起作用,除非 SomeObject 本身有 SomeObject 属性。
  • @Clemens 你说得对,我的错,我会编辑澄清这不是我想说的。
  • @Clemens 这里改了命名,希望能澄清一下

标签: c# wpf datagrid


【解决方案1】:

您通常将DataGrid 中的列绑定到DataGridItemsSource 中项目的属性,即您当前的绑定仅在ItemsSource 属性绑定或设置为@ 时才有效987654326@ 和 T 类型具有 SomeObject 属性。

如果要绑定到另一个对象的属性,可以使用{RelativeSource} 明确指定绑定的来源:

<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Name">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding DataContext.SomeObject.Name, RelativeSource={RelativeSource AncestorType=UserControl}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding DataContext.SomeObject.Name, RelativeSource={RelativeSource AncestorType=UserControl}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Name" Binding="{Binding SomeObject.Name}" />
    </DataGrid.Columns>
</DataGrid>

【讨论】:

  • 我试图在我的NestedObject(见编辑)中创建另一个属性,它是一个包含Name 值的List&lt;string&gt;。像这样调用它,&lt;DataGridTextColumn Header="Name" Binding="{Binding NestedObject.NameCollection}" /&gt; 不起作用。
  • 一个列表没有 Name 属性。 TextBlock 绑定是否有效?那么由于我在答案中写的内容,列绑定将永远无法工作。
  • Textblock 绑定确实有效。但不是 Datagrid 中的那个,是的,我想我明白了。我必须为该特定属性实现一个 IEnumerable。
  • @scharette - 查看这篇文章 --- stackoverflow.com/questions/34102927/…
猜你喜欢
  • 2010-10-03
  • 2016-04-10
  • 2013-04-12
  • 2011-07-01
  • 2015-02-16
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多