2009-09-30 98 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);