C# Silverlight Gridview-属性更改时更新组

C# Silverlight Gridview-属性更改时更新组,c#,silverlight,gridview,silverlight-toolkit,C#,Silverlight,Gridview,Silverlight Toolkit,假设我们有一个具有两个字符串属性的简单类,实现INPC: public class TestClass : INotifyPropertyChanged { private string _category; public string Category { get { return _category; } set { _category = value; NotifyPropertyCh

假设我们有一个具有两个字符串属性的简单类,实现INPC:

 public class TestClass : INotifyPropertyChanged
    {
        private string _category;
        public string Category
        {
            get { return _category; }
            set { _category = value; NotifyPropertyChanged("Category"); }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; NotifyPropertyChanged("Name"); }
        }

        private void NotifyPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
让我们创建一个ObservableCollection,并将其分配给PagedCollectionView:

public PagedCollectionView MyItems { get; set; }

public void Test()
{
    var items = new ObservableCollection<TestClass>();
    items.Add(new TestClass { Category = "A", Name = "Item 1" });
    items.Add(new TestClass { Category = "A", Name = "Item 2" });
    items.Add(new TestClass { Category = "B", Name = "Item 3" });
    items.Add(new TestClass { Category = "B", Name = "Item 4" });
    items.Add(new TestClass { Category = "C", Name = "Item 5" });
    items.Add(new TestClass { Category = "C", Name = "Item 6" });
    items.Add(new TestClass { Category = "C", Name = "Item 7" });

    MyItems = new PagedCollectionView(items);
    MyItems.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
}
publicpagedcollectionview MyItems{get;set;}
公开无效测试()
{
var items=新的ObservableCollection();
添加(新的TestClass{Category=“A”,Name=“Item 1”});
添加(新的TestClass{Category=“A”,Name=“Item 2”});
添加(新的TestClass{Category=“B”,Name=“Item 3”});
添加(新的TestClass{Category=“B”,Name=“Item 4”});
添加(新的TestClass{Category=“C”,Name=“Item 5”});
添加(新的TestClass{Category=“C”,Name=“Item 6”});
添加(新的TestClass{Category=“C”,Name=“Item 7”});
MyItems=新页面集合视图(项目);
添加(新属性GroupDescription(“类别”);
}
  • 请注意,我们还设置了一个类别分组
然后,使用MVVM将其绑定到XAML中:

<sdk:DataGrid ItemsSource="{Binding Path=MyItems}" />

如果我们随后进入并编辑其中一个类别,例如将其中一个“C”更改为“A”,gridview将出色地处理它。它维护组的折叠状态,甚至在需要时添加新的组头

当我们在viewmodel中以编程方式更改类别(例如,从绑定到相同数据的另一个gridview中更改类别)时,就会出现问题。在这种情况下,类别文本将更新,但项目不会移动到新的适当组中,不会创建新组,也不会更新行标题,等等

在gridview编辑功能之外更改属性时,如何触发gridview更新其组


欢迎使用任何变通方法,但是触发简单刷新()并不会消除滚动/折叠等操作。

您需要使用EditItem()和committedit()包装编辑


有趣的是,如果对PagedCollectionView进行了筛选,并且编辑将项目的状态从筛选出更改为筛选进入,则gridview仅在定义了分组的情况下才会将项目弹出到视图中。
        // The following will fail to regroup
        //(MyItems[3] as TestClass).Category = "D";

        // The following works
        MyItems.EditItem(MyItems[3]);
        (MyItems[3] as TestClass).Category = "D";
        MyItems.CommitEdit();

        // The following will also fail to regroup            
        //(MyItems[3] as TestClass).Category = "D";
        //items[3] = items[3];

        // fails as well, surprisingly
        //(MyItems[3] as TestClass).Category = "D";
        //TestClass tmp = items[3];
        //items.RemoveAt(3);
        //items.Insert(3, tmp);