Привязка DataGridComboBoxColumn ItemsSource к RelativeSource FindAncestor не работает - PullRequest
2 голосов
/ 06 июля 2010

Я пытаюсь использовать элемент управления DataGrid WPFoolkit (и C # /. Net 3.5) для отображения ComboBox для каждой записи. С помощью приведенного ниже кода 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>

Кроме того, в окне вывода 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')

Однако следующий код работает должным образом (выпадающие списки ComboBox заполнены правильно):

<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>

Обратите внимание, что и DataGrid, и ItemsControl имеют идентичные строки ItemsSource. То же самое делают DataGridComboBoxColumn и ComboBox. Один элемент управления связывается правильно, а другой - нет.

Почему источник DataGridComboBoxColumn ItemsSource не связывается должным образом?

Спасибо,
Ben

К вашему сведению, diagnostics определяется как xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"

1 Ответ

3 голосов
/ 06 июля 2010

Интересно ... если я создаю пользовательский DataGridColumn, содержащий ComboBox, и использую ту же строку привязки 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>
...