C# CollectionViewSource:LiveShaping属性不起作用

C# CollectionViewSource:LiveShaping属性不起作用,c#,wpf,collectionviewsource,C#,Wpf,Collectionviewsource,我使用的CollectionViewSource具有LiveShaping属性,尤其是分组激活。问题是更改分组属性不会立即生效。但是,当我通过手动调用视图上的refresh来刷新视图时,它可以工作 但问题是,如果CollectionViewSource上的LiveShaping属性不起作用,为什么我会有这些属性?还是我做错了什么 以下是一个例子: using System; using System.Collections.ObjectModel; using System.ComponentM

我使用的CollectionViewSource具有LiveShaping属性,尤其是分组激活。问题是更改分组属性不会立即生效。但是,当我通过手动调用视图上的refresh来刷新视图时,它可以工作

但问题是,如果CollectionViewSource上的LiveShaping属性不起作用,为什么我会有这些属性?还是我做错了什么

以下是一个例子:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Data;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            ObservableCollection<Test> TestList = new ObservableCollection<Test>();

            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    Test t = new Test()
                    {
                        Group = i.ToString(),
                        Name = (j + (i * 10)).ToString()
                    };

                    TestList.Add(t);
                }
            }

            CollectionViewSource aViewSource = new CollectionViewSource();
            aViewSource.Source = TestList;

            aViewSource.IsLiveGroupingRequested = true;
            aViewSource.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
            aViewSource.LiveGroupingProperties.Add("Group");

            foreach (CollectionViewGroup o in aViewSource.View.Groups)
            {
                Console.WriteLine(o.Name);
                foreach (Test o2 in o.Items)Console.WriteLine("     " + o2.Name);
            }

            Console.WriteLine("----------------------------------------------");


            TestList[4].Group = "4";

            //aViewSource.View.Refresh(); When using this line it works.

            foreach (CollectionViewGroup o in aViewSource.View.Groups)
            {
                Console.WriteLine(o.Name);
                foreach (Test o2 in o.Items) Console.WriteLine("     " + o2.Name);
            }

            Console.WriteLine("----------------------------------------------");


            foreach (Test test in TestList)
            {
                Console.WriteLine("{0}: {1}", test.Group, test.Name);
            }


            Console.WriteLine("----------------------------------------------");
            Console.ReadKey();
        }
    }

    public class Test : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string myName;
        private string myGroup;

        public string Name
        {
            get
            {
                return myName;
            }

            set
            {
                myName = value;
                OnPropertyChanged();
            }
        }

        public string Group
        {
            get
            {
                return myGroup;
            }

            set
            {
                myGroup = value;
                OnPropertyChanged();
            }
        }


        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName_in = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName_in));
        }

        public override string ToString()
        {
            return $"{Group}: {Name}";
        }
    }
}
使用系统;
使用System.Collections.ObjectModel;
使用系统组件模型;
使用System.Runtime.CompilerServices;
使用System.Windows.Data;
命名空间控制台应用程序6
{
班级计划
{
静态void Main(字符串[]参数)
{
ObservableCollection TestList=新的ObservableCollection();
对于(int i=0;i<3;i++)
{
对于(int j=0;j<3;j++)
{
测试t=新测试()
{
Group=i.ToString(),
Name=(j+(i*10)).ToString()
};
TestList.Add(t);
}
}
CollectionViewSource aViewSource=新的CollectionViewSource();
aViewSource.Source=TestList;
aViewSource.IsLiveGroupingRequested=true;
添加(新属性GroupDescription(“组”);
aViewSource.LiveGroupingProperties.Add(“组”);
foreach(aViewSource.View.Groups中的CollectionViewGroup o)
{
控制台写入线(o.Name);
foreach(o.Items中的测试o2)控制台.WriteLine(“+o2.Name”);
}
Console.WriteLine(“-------------------------------------------------------------”;
TestList[4].Group=“4”;
//aViewSource.View.Refresh();使用此行时,它可以正常工作。
foreach(aViewSource.View.Groups中的CollectionViewGroup o)
{
控制台写入线(o.Name);
foreach(o.Items中的测试o2)控制台.WriteLine(“+o2.Name”);
}
Console.WriteLine(“-------------------------------------------------------------”;
foreach(测试列表中的测试)
{
Console.WriteLine(“{0}:{1}”,test.Group,test.Name);
}
Console.WriteLine(“-------------------------------------------------------------”;
Console.ReadKey();
}
}
公共类测试:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私有字符串myName;
私有字符串组;
公共字符串名
{
收到
{
返回我的名字;
}
设置
{
myName=值;
OnPropertyChanged();
}
}
公共字符串组
{
收到
{
返回myGroup;
}
设置
{
myGroup=值;
OnPropertyChanged();
}
}
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName_in=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName_in));
}
公共重写字符串ToString()
{
返回$“{Group}:{Name}”;
}
}
}

A
CollectionViewSource
如果控制台应用程序中没有可用的调度程序,那么启用实时分组的
CollectionViewSource
在控制台应用程序中不起作用,原因与您的其他问题的答案中提到的相同:


明白了。但是,当在WPF窗口中使用相同的代码时,只有在我显式调用View.Refresh()方法或将iot作为ItemsSource连接到例如ListBox的情况下,相同的代码才会起作用。请提供您的问题的WPF示例。