问题描述
我有一个MVVM应用程序,其中显示了一个DataGrid
,其中列绑定到视图模型中的ObservableCollection<DataGridColumn>
。
<DataGrid AutoGenerateColumns="False" util:DataGridColumnsBehavIoUr.BindableColumns="{Binding Path=TagColumns}" ItemsSource="{Binding Path=TagList}"/>
这些列之一是Material Design in XAML (v2.5.1)中的MaterialDesignDataGridComboBoxColumn
,当我将ItemSource
设置为列表时,所有列均按预期工作。但是,我要绑定的列表也要过滤,因此我设置了一个CollectionViewSource
,将其用作Source
,并将该列的ItemSource
设置为View
。
class Model
{
class AggregateSummary
{
public string Id { get; }
public string Name { get; }
public string Description { get; }
public AggregateSummary(string id,string name,string description)
{
this.Id = id;
this.Name = name;
this.Description = description;
}
}
public ObservableCollection<object> TagList { get; }
public ObservableCollection<DataGridColumn> TagColumns { get; }
public ObservableCollection<AggregateSummary> TagStatus { get; }
public CollectionViewSource TagStatusCVS { get; }
public Model()
{
this.TagColumns = ObservableCollection<DataGridColumn>();
this.TagStatus = new ObservableCollection<AggregateSummary>
{
new AggregateSummary(string.Empty,"ALL","All Statuses")
};
this.TagStatusCVS = new CollectionViewSource() { Source = this.TagStatus };
this.TagStatusCVS.Filter += (sender,e) =>
{
var item = (AggregateSummary)e.Item;
e.Accepted = !string.IsNullOrEmpty(item.Id);
};
var tagStatusColumn = new MaterialDesignDataGridComboBoxColumn()
{
ItemsSource = this.TagStatus,// works as expected
//ItemsSource = this.TagStatusCVS.View,// causes all items in the grid to update at the same time
Header = "Tag Status",displayMemberPath = nameof(AggregateSummary.Name),SelectedValuePath = nameof(AggregateSummary.Id),};
this.TagColumns.Add(tagStatusColumn);
}
}
正如代码中的注释所指出的那样,在后面的代码中使用CollectionViewSource
填充组合框的项目会导致网格中的所有项目同时更新。
问题是,如何过滤原始列表TagStatus
而不会最终导致这种共享行为?
更新:
我已将问题归结为适用于为该列生成的组合框的样式。我正在使用MaterialDesign WPF主题(v2.5.1),并且声明的MaterialDesignDataGridComboBoxTemplate
样式似乎导致第一行的值出现在为该列生成的所有组合框中。有open issue on github描述了同样的问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)