2

我有一个EditTemplate为网格定义的 Xceed DataGrid。

网格显示绑定到大约 6 列的集合的项目列表,并且EditTemplateTextBox用于输入数量的控件。我希望该IsReadOnly属性绑定到不同的属性,以便该项目具有序列号,IsReadOnly将设置为 true 以便用户无法输入值。我想绑定到SerialNum同一个集合中的属性并将其传递给转换器以返回真/假值。我已经写好了转换器;但是,我在绑定到要传递给转换器的属性时遇到问题。

DataGridCollectionViewSource的很简单:

<xcdg:DataGridCollectionViewSource x:Key="transferItems" Source="{Binding TransferItems}" />

TransferItems在我的 ViewModel 中设置,并且所有列都正确绑定。

对于我所有的通用显示列,它们通过以下方式正确显示:

<xcdg:Column Title="Serial No." AllowSort="False" FieldName="SerialNum" />

我的问题在于定义xcgd:CellEditor模板,我很确定我的问题是围绕RelativeSource. 我尝试了许多不同的组合,试图TransferItems.SerialNum从我的 ViewModel 中获取该属性,但没有任何组合有效。

这是我目前拥有的:

<xcdg:Column Title="Xfer Qty Good" TextWrapping="Wrap" ReadOnly="False" Width="50" AllowGroup="False" AllowSort="False" FieldName="TransferQtyGood">
    <xcdg:Column.CellEditor>
        <xcdg:CellEditor>
            <xcdg:CellEditor.EditTemplate>
                <DataTemplate>
                    <TextBox x:Name="QtyGood" Margin="2,2,2,2" Width="50" HorizontalAlignment="Center" VerticalAlignment="Center"
                    Text="{xcdg:CellEditorBinding}" IsReadOnly="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type xcdg:DataGridCollectionViewSource}}, Path=DataContext.TransferItems.SerialNum, Converter={StaticResource serialToEnabledConverter}}"
                     />
                </DataTemplate>
            </xcdg:CellEditor.EditTemplate>
        </xcdg:CellEditor>
    </xcdg:Column.CellEditor>
</xcdg:Column>

这给出了运行时错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='Xceed.Wpf.DataGrid.DataGridCollectionViewSource', AncestorLevel='1''. BindingExpression:Path=DataContext.TransferItems.SerialNum; DataItem=null; target element is 'TextBox' (Name='QtyGood'); target property is 'IsReadOnly' (type 'Boolean')

我明白错误告诉我什么,但我只是得到了正确的RelativeSource路径。我已经阅读了一些关于枚举的有用帖子,但RelativeSource仍然缺少一些东西。

4

1 回答 1

3

以防万一有人遇到这个问题,我终于能够以这种方式进行绑定。关键是定义正确的 RelativeSource 路径:

<TextBox x:Name="QtyGood" Margin="2,2,2,2" Width="50" HorizontalAlignment="Center" VerticalAlignment="Center"
                                     Text="{xcdg:CellEditorBinding}" GotFocus="Qty_GotFocus" LostFocus="Qty_LostFocus"
                                     IsReadOnly="{Binding RelativeSource={RelativeSource AncestorType={x:Type xcdg:DataRow}}, Path=DataContext.SerialNum, Converter={StaticResource serialToEnabledConverter}}"
                                     />
于 2017-05-30T14:24:39.717 回答