3

productColumn2 的绑定适用于两种方式。当我为每个添加转换器时,productColumn1 称为转换器;但在从可观察集合加载时始终将其值设置为 null,或在分配时将值设置为产品(但实际上并未分配可观察集合)。

问题与 DataContext 和 LogicalTree 有关。ProductSelectorTextBoxUserControl 的 DataContext 是它本身,并用于它自己的代码。我希望能够将其“文本”属性绑定到我的可观察集合,如在 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>

4

2 回答 2

2

如果对自身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,您是在告诉绑定ProductDataGridRow.DataContext.

更新

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

ItemContainerGenerator创建 eachDataGridRow时,它将行设置DataContextObservableCollectionItems. 所以,逻辑树是这样的:

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

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

于 2012-08-08T15:50:46.083 回答
0

感谢@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}" />

关键点是RelativeSource DataGridRow,Path是Item(ObservableCollection).Property

如果您注意到提到文本的问题并且这是指产品,我不得不切换到产品并添加转换器。然后 UserControl 将设置自己的文本

于 2012-08-09T15:46:46.097 回答