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