2009-09-30 97 views
12
之外

我想做如下:C#/ WPF:DataGrid中綁定組合框的ItemSource到元素的DataContext

public List<Users> PreLoadedUserList { get; set; } 
public List<RowEntries> SomeDataRowList { get; set; } 

public class Users 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 
public class SomeDataRowList 
{ 
    public int UserAge { get; set; 
} 

現在我(WPF工具包)的DataGrid是這樣的:

<my:DataGrid AutoGenerateColumns="False" MinHeight="200" 
      ItemsSource="{Binding Path=SomeDataRowList}"> 
    <my:DataGridComboBoxColumn Header="Age" 
           ItemsSource="{Binding Path=PreLoadedUserList}" 
           DisplayMemberPath="Name" 
           SelectedValueBinding="{Binding Path=UserAge}"/> 

</my:DataGrid> 

現在我的問題是,PreLoadedUserList不在ItemSource(SomeDataRowList)之外,我不知道如何綁定到它之外的東西。我真正想要的: - 顯示在ComboBox PreLoadedUserList - (RowEntries)SelectedItem.UserAge的值設置爲選定的價值ComboboxItem.Age

讓我知道,如果我的解釋是太詭異了:-)

謝謝 乾杯

回答

23

在這裏,我們去:-)

<my:DataGridTemplateColumn Header="SomeHeader"> 
    <my:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox SelectedValuePath="UserAge" 
       SelectedValue="{Binding Age}" 
       DisplayMemberPath="Name" 
       ItemsSource="{Binding Path=DataContext.PreLoadedUserList, 
        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
       IsReadOnly="True" Background="White" /> 
     </DataTemplate> 
    </my:DataGridTemplateColumn.CellTemplate> 
</my:DataGridTemplateColumn> 

希望這可以幫助別人了。

乾杯

+0

這對我幫助很大......謝謝! – 2010-12-31 20:59:55

+0

哇,我試圖用'DataGridComboBoxColumn'嘗試並沒有任何內容..但後來魔術!你美麗的例子工程(與模板的東西)謝謝! – 2011-02-15 16:43:17

+0

這幫助我解決了我的問題,約瑟夫。處理這些頭組合框是我的下一個任務。你的解決方案幫了我很多,並節省了我很多時間。非常感謝。 – Tvd 2013-08-30 09:18:51

0

如果RowEntries是一個自定義類,只是把它交給PreLoadedUserList參考。然後,每個實例都有一個指向它的指針,您可以在綁定中使用它。

只是一個建議,像Users和RowEntries這樣的類名稱表明它們是集合,但是您的用法看起來像它們不是集合的項目。我會使用單數名稱來避免混淆。我會做這樣的事情

public List<User> PreLoadedUserList { get; set; } 
public List<RowEntry> SomeDataRowList { get; set; } 

public class User 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 
public class RowEntry 
{ 
    public int UserAge { get; set; } 
    public List<User> PreLoadedUserList { get; set; } 
} 

// at the point where both PreLoadedUserList is instantiated 
// and SomeDataRowList is populated 
SomeDataRowList.ForEach(row => row.PreLoadedUserList = PreLoadedUserList);