3

これが機能する理由を誰か教えてください。

<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}}}" />

2 番目のスニペットは、編集時に SupplierName のリストを表示しません...

4

2 に答える 2

5

これDataGridComboBoxColumnは、a がユーザー インターフェイス要素ではなく、ユーザー インターフェイス要素であるためComboBoxです。

最初の例でComboBoxは、ビジュアル ツリーの一部であるRelativeSourceため、要求された項目を探して UI ツリーを上っていくという、本来の目的を実行できます。しかし、2 番目の例では、DataGridComboBoxColumnは ですがDependencyObject、実際の UI 要素ではありません。これは、UI 要素について何かを説明するオブジェクトです。

ElementName代わりに使用してみて、ルート ウィンドウに名前を付けることができます。または、次の方法で回避できる場合があります。

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

DataContextウィンドウからグリッドに流れ落ちるため、UI のこの時点で何か他のもので上書きしない限り、引き続き使用できます。

または、それがうまくいかない場合は、関連するコレクションをリソース ディクショナリに追加してSource={StaticResource suppliers}、バインディングで a を使用して取得できるようにすることもできます。

于 2010-11-07T23:33:36.347 に答える
0

これは、DataGridComboBoxColumn の ItemsSource が見つからないためです。

RelativeSource Binding を使用して、それを正しい DataContext AncestorType にポイントする必要があります。ItemsSource を満たすリストを含む DataContext を見つけるには、試行錯誤が必要です。

于 2011-12-16T21:46:25.923 に答える