Связывание данных WPF Datagrid ComboBox - PullRequest
3 голосов
/ 08 ноября 2010

Может кто-нибудь сказать мне, почему это работает;

<DataGridTemplateColumn Header="Supplier">
  <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
          <ComboBox DisplayMemberPath="SupplierName" SelectedValuePath="SupplierID" 
                    SelectedValue="{Binding SupplierID}"
                    ItemsSource="{Binding Path=DataContext.Suppliers, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
      </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>

, но это не так;

<DataGridComboBoxColumn Header="Combo" DisplayMemberPath="SupplierName" SelectedValuePath="SupplierID" 
  SelectedValueBinding="{Binding SupplierID}"
  ItemsSource="{Binding Path=DataContext.Suppliers, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />

Второй фрагмент не показывает список SupplierName при редактировании ...

Ответы [ 2 ]

5 голосов
/ 08 ноября 2010

Это потому, что DataGridComboBoxColumn не является элементом пользовательского интерфейса, а ComboBox - это.

В первом примере, поскольку ваш ComboBox является частью визуального дерева, RelativeSource может делать то, что должен: ходить по дереву пользовательского интерфейса в поисках запрашиваемого вами элемента. Но во втором примере DataGridComboBoxColumn - это DependencyObject, но это не фактический элемент пользовательского интерфейса - это объект, который описывает что-то об элементе пользовательского интерфейса.

Вы можете вместо этого попробовать ElementName и дать имя своему корневому окну. Или вы можете сойти с рук просто:

<DataGridComboBoxColumn ...
   ItemsSource="{Binding Path=Suppliers}" />

DataContext будет перетекать из окна в сетку, поэтому, если вы не переопределите его чем-то другим в этой точке пользовательского интерфейса, он все равно будет доступен.

Или, если это не сработает, вы можете добавить соответствующую коллекцию в словарь ресурсов, чтобы получить ее с Source={StaticResource suppliers} в привязке.

0 голосов
/ 17 декабря 2011

Причина в том, что нельзя найти ItemsSource для DataGridComboBoxColumn.

Вам нужно будет использовать привязку RelativeSource и указать правильный DataContext AncestorType. Это займет несколько проб и ошибок, чтобы найти DataContext, который содержит ваш список, чтобы удовлетворить ваш ItemsSource.

...