将XceedData列EditTemplate绑定到不同的属性

时间:2017-03-17 15:58:07

标签: wpf data-binding xceed-datagrid

我有一个Xceed DataGrid,其中为网格定义了EditTemplate

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

我的DataGridCollectionViewSource很简单:

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

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

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

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

我的问题在于定义xcgd:CellEditor模板,我很确定我的问题在RelativeSource附近。我尝试过很多不同的组合试图从我的ViewModel获取TransferItems.SerialNum属性,但没有任何组合可用。

这就是我目前所拥有的:

<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的枚举中阅读了一些有用的帖子,但仍然遗漏了一些内容。

1 个答案:

答案 0 :(得分:2)

万一有人遇到这个问题,我终于能够以这种方式获得绑定。关键是定义正确的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}}"
                                     />