将 DataGridComboBoxColumn ItemsSource 绑定到relativeSource FindAncestor 不起作用

Ben*_*udo 4 binding wpftoolkit wpfdatagrid

我正在尝试使用 WPFToolkit 的 DataGrid 控件(和 C#/.Net 3.5)来显示每个记录的 ComboBox。使用以下代码,组合框会显示,但其下拉列表不包含任何项目:

<wpftkit:DataGrid ItemsSource="{Binding TransactionToEdit.SisterTransactions}"
          AutoGenerateColumns="False">
<wpftkit:DataGrid.Columns>
    <wpftkit:DataGridComboBoxColumn Header="Account" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel},  diagnostics:PresentationTraceSources.TraceLevel=High}, Path=DataContext.Accounts}" DisplayMemberPath="Name"/>
</wpftkit:DataGrid.Columns>
</wpftkit:DataGrid>
Run Code Online (Sandbox Code Playgroud)

此外,Visual Studio 的输出窗口显示以下错误:

System.Windows.Data Error: 4 : Cannot find source for binding with 
  reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.StackPanel', AncestorLevel='1''. 
  BindingExpression:Path=DataContext.Accounts; DataItem=null; target element is 
  'DataGridComboBoxColumn' (HashCode=25733404); target property is 
  'ItemsSource' (type 'IEnumerable')
Run Code Online (Sandbox Code Playgroud)

但是,以下代码按预期工作(组合框的下拉列表已正确填充):

<ItemsControl ItemsSource="{Binding TransactionToEdit.SisterTransactions}">
<ItemsControl.ItemTemplate>
    <DataTemplate>
    <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=DataContext.Accounts, diagnostics:PresentationTraceSources.TraceLevel=High}" DisplayMemberPath="Name"/>
    </DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

请注意,DataGrid 和 ItemsControl 都具有相同的 ItemsSource 字符串。DataGridComboBoxColumn 和 ComboBox 也是如此。一个控件绑定正确,而另一个控件绑定不正确。

为什么 DataGridComboBoxColumn ItemsSource 无法正确绑定?

谢谢你,

仅供参考,diagnostics定义为xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"

Ben*_*udo 5

有趣的是...如果我创建一个包含 ComboBox 的自定义 DataGridColumn 并使用与上面给出的相同的 ItemsSource 绑定字符串,它就可以工作。

<wpftkit:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <ComboBox SelectedItem="{Binding Account}" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=DataContext.Accounts}"        DisplayMemberPath="Name" />
    </DataTemplate>
</wpftkit:DataGridTemplateColumn.CellTemplate>
Run Code Online (Sandbox Code Playgroud)

  • 我发现如果我将 ComboBox 放入 CellTemplate 中,可能会发生奇怪的事情......例如当行切换到编辑模式时 ComboBox 会丢失其选定的值。解决此问题的一个简单方法是让 CellTemplate 显示 TextBlock,然后将 ComboBox 放置在 CellEditingTemplate 中。 (3认同)