2010-11-07 110 views
3

誰能告訴我爲什麼這個工作;WPF Datagrid ComboBox DataBinding

<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列表...

回答

5

這是因爲一個DataGridComboBoxColumn不是用戶界面元素,但ComboBox是。

在第一個示例中,因爲您的ComboBox是可視化樹的一部分,因此RelativeSource可以執行應有的操作:沿UI樹查找您要求的項目。但在第二個示例中,DataGridComboBoxColumnDependencyObject,但它不是一個實際的UI元素 - 它是描述有關UI元素的對象。

您可以嘗試使用ElementName來代替,併爲您的根窗口命名。或者,你也許可以用只是爲了脫身:

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

DataContext會從窗口向下流動到電網,因此,除非您overidden它與別的東西在這一點上的UI,它我仍然可以使用。

或者如果這不起作用,您可能需要將相關集合添加到資源字典中,以便在綁定中使用Source={StaticResource suppliers}

+0

發現ElementName似乎沒有工作出於同樣的原因,並且Path = Suppliers不起作用,因爲DataGrid的DataContext已經綁定到行集合。結束了DataTemplates,並使用MultiBinding&a Converter在非編輯模式下顯示名稱。無論如何,你回答*爲什麼*它不起作用是正確的:) – 2010-11-09 01:07:18

0

原因是無法找到DataGridComboBoxColumn的ItemsSource。

您將需要使用RelativeSource綁定並將其指向正確的DataContext AncestorType。這將需要一些試驗和錯誤來查找包含您的列表的DataContext以滿足您的ItemsSource。

+0

問題中的第一個示例指示應該從哪裏檢索ItemsSource。你將如何通過DataGridComboBoxColumn.ItemsSource訪問它? – 2012-01-12 03:26:30