从后面的代码进行设置时,MaterialDesignDataGridComboBoxColumn ItemSource共享CollectionViewSource的单个实例

问题描述

我有一个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 (将#修改为@)