相同的绑定适用于 1 个 XAML 项,但对另一个 XAML 项为 null

本文关键字:XAML 另一个 null 项为 绑定 适用于 | 更新日期: 2024-11-06 04:57:39

productColumn2 的绑定双向完美。当我为每个转换器添加一个转换器时,productColumn1 调用了转换器;但在从可观察集合加载时始终将其值设置为 null,或在分配时将其值设置为 product(但实际上并未分配可观察集合)。

问题与DataContext和LogicalTree有关。ProductSelectorTextBoxUserControl 的 DataContext 是它本身,用于它自己的代码。我希望能够将其"text"属性绑定到我的可观察集合,如 productColumn2 中所示。到目前为止,我似乎无法将ProductSelectorTextBoxUserControl DataContext设置为此处使用的DataContext。

<DataGrid ItemsSource="{Binding Path=ObservableCollectionItems, Mode=OneWay}" AutoGenerateColumns="False" EnableRowVirtualization="True" >
<DataGrid.Columns>
    <DataGridTemplateColumn x:Name="productColumn1" SortMemberPath="Product" >
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <productSelector:ProductSelectorTextBoxUserControl Text="{Binding Path=Product, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus, ValidatesOnExceptions=True}" /> 
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTextColumn x:Name="productColumn2" Binding="{Binding Path=Product, Mode=TwoWay, NotifyOnSourceUpdated=True}" />            
</DataGrid.Columns>

相同的绑定适用于 1 个 XAML 项,但对另一个 XAML 项为 null

如果ProductSelectorTextBoxUserControl设置了DataContext,则Binding将无法找到Product属性,因为它不存在。您需要修改绑定,以便它知道在哪里可以找到 Product 属性;这样的东西可能会起作用:

<productSelector:ProductSelectorTextBoxUserControl Text="{Binding Path=Product, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=LostFocus, ValidatesOnExceptions=True}" />

通过添加 RelativeSource ,可以告诉绑定在DataGridRow.DataContext中查找 Product 属性。

更新

你试过{RelativeSource AncestorType={x:Type DataGridRow}}吗?您应该以行而不是网格为目标。

ItemContainerGenerator创建每个DataGridRow时,它会将行的DataContext设置为ObservableCollectionItems中的相应项。所以,逻辑树是这样的:

  • DataGrid (DataContext = 定义ObservableCollectionItems的对象)
    • DataGridRow (数据上下文 = ObservableCollectionItems[0]
      • ProductSelectorTextBoxUserControl (DataContext = self)
    • DataGridRow (数据上下文 = ObservableCollectionItems[0]
      • ProductSelectorTextBoxUserControl(DataContext = self)

网格的DataContext不会公开 Product 属性,它是在集合中的每个元素上定义的(除非我错过了什么)。Product属性应位于每一行的上下文中。

感谢@SellMeADog在这方面帮助我,但这仍然花了我很长时间才弄清楚。最后一行是:

<productSelector:ProductSelectorTextBoxUserControl x:Name="productSelector" Product="{Binding Path=Item.Product, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow, AncestorLevel=1}, Converter={StaticResource productNameToProductConverter}, Mode=TwoWay, NotifyOnSourceUpdated=True, ValidatesOnExceptions=True}" />

关键点是相对源数据网格行,路径是项目(可观察集合)。财产

如果您注意到问题涉及文本并且这涉及产品,我不得不切换到产品并添加转换器。然后,用户控件将设置自己的文本