我一直在为我的问题寻找解决方案已经有一段时间了,所以现在我只是在这里发布一些代码!
我正在使用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。
有没有解决方案?
答案 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" />