【问题标题】:Silverlight Gridview - Update Groups upon property changeSilverlight Radgridview - 在属性更改时更新组
【发布时间】:2012-06-01 22:45:31
【问题描述】:

假设我们有一个具有两个字符串属性的简单类,实现 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"));
}
  • 请注意,我们还设置了类别分组

然后,我们使用 MVVM 将其绑定到 XAML 中:

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

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

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

当属性在网格视图编辑功能之外发生更改时,如何触发网格视图更新其组?

欢迎任何解决方法,但是触发简单的 Refresh() 不会消除滚动/折叠/等。

【问题讨论】:

    标签: c# silverlight gridview silverlight-toolkit


    【解决方案1】:

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

            // 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);
    

    【讨论】:

    • 有趣的是,如果 PagedCollectionView 被过滤,并且编辑将项目的状态从被过滤掉到被过滤掉,gridview 只会在定义了分组的情况下将项目弹出到视图中.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2012-12-23
    • 2020-02-11
    相关资源
    最近更新 更多