将ComboBox数据绑定到DataGrid中的SelectedItem

时间:2011-11-21 19:15:42

标签: wpf mvvm datagrid

我一直在为我的问题寻找解决方案已经有一段时间了,所以现在我只是在这里发布一些代码!

我正在使用MVVM处理我的应用程序中的数据,该问题涉及以下两个ViewModel类

public class vmProject : vmBase
{
private Project project;


public User Owner
{
    get { return project.Owner; }
    set {project.Owner = value; OnPropertyChanged("Owner"); }
}


public vmProject(Project project)
{
    this.project = project;
}

}

public class User
{
public int Id { get; set; }
public string ShortName { get; set; }
public string FullName { get; set; }
}

我将所有项目加载到ObservableCollection中,将所有用户加载到ObservableCollection中。 现在我想显示DataGrid中的所有项目,其中ComboBox显示用户的ShortName。数据网格还应该有一个文本列,用于显示所有者的FullName。

我的问题是,我无法弄清楚是否应该使用DataGridComboBoxColumn或DataGridTemplateColumn。以及如何在每个中使用数据绑定......

当用户在组合框中选择新的所有者时,应该更新模型以及FullName-column。

有没有解决方案?

2 个答案:

答案 0 :(得分:0)

我不是MVVM peron但是如果没有MVVM,我就是这样做的。不要认为你需要UsersFiltered和ObservableCollection。如果UsersAll是Observable集合,它将在您选择新名称时选取新行。

 bind the grid to a filtered list 


 public List<User> UsersFiltered 
 {
    get
    {
         return UsersAll.Where(usr => user = SelectedCBUser).ToList();
    }
 {

答案 1 :(得分:0)

这是一个在Template列中使用ComboBox的示例。它假定您的UserCollection属于DataContext

的同一ProjectsCollection的一部分
<DataGridColumn>
    <DataGridColumn.Template>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding 
                          RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
                          Path=DataContext.UserCollection}"
                      SelectedValue="{Binding Owner}"
                      DisplayMemberPath="ShortName" />
        </DataTemplate>
    </DataGridColumn.Template>
</DataGridColumn>

当WPF比较SelectedValue的对象时,它会通过引用对它们进行比较。因此,除非每个属性上的User对象与内容UserCollection中的内容完全相同,否则此值将返回false,并且不会选择该项。解决此问题的一种方法是User类的overwrite the .ToString() method,因此如果ID字段匹配,则认为项目相等。

另一种方法是使用SelectedValuePath并将SelectedValue绑定到通用数据类型,例如int UserId字段。

<ComboBox ItemsSource="{Binding 
               RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
               Path=DataContext.UserCollection}"
          SelectedValue="{Binding Owner.Id}"
          SelectedValuePath="Id"
          DisplayMemberPath="ShortName" />