C# Silverlight Gridview-属性更改时更新组
假设我们有一个具有两个字符串属性的简单类,实现INPC: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
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(“类别”);
}
- 请注意,我们还设置了一个类别分组
<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);