作者name2name2 (yang~hi)
看板C_Sharp
标题Re: [问题] 客制化CollectionViewGroup
时间Fri Sep 22 03:00:47 2017
这我觉得有难度,刚有找出可能解法
改完结果,我测试按下button可以更新UI
https://gist.github.com/name2name2/86bf81be8e291a1a0e951f1b84e65b44
https://i.imgur.com/OVAoMGY.gif
--修改过程及分析--
..
推测不会更新原因:
通常UI不会更新,有可能集合没有INotifyPropertyChanged功能,
或是集合的元素class里面的属性没有使用INotifyPropertyChange,
所以我猜xaml里Resource区的的CollectionViewSource 可能不具有PropChange类似功能
我对DynamicResource的概念没有很清楚,但我有试试看在xaml里面
在ListBox改用DynamicResource,不过好像也没有效果
後来google staticresource property changed
找到这篇
https://goo.gl/GKV86H
里面有一个解答是认为resource不会被observed,
所以她建议去binding 可以INotifyPropertyChanged的东西
..
然後我看xaml後,对google查了些东西,
在查 ListCollectionView.Groups example 的时候,
查到这篇范例
https://goo.gl/aRuPBX
他里面直接用
ICollectionView view = CollectionViewSource.GetDefaultView(myList);
view.GroupDescriptions.Add(new PropertyGroupDescription("Country"));
lbPersonList.ItemsSource = view;
去做到group的效果
我用相同概念改写在xaml.cs里完成
这边最神奇的应该是 GetDefaultView
官方文件的概念解释满有趣的,
https://goo.gl/GxmYwA
WPF always binds to a view rather than a collection
然後很神奇的是,这样写之後,
ListBox的ItemSource直接绑Employees竟然就有更新的效果,
而且还可以分group
推测可能GetDefaultView加下去後,对Employees有群组效果
特别是这里private ICollectionView EmployeesSource完全没有写在xaml竟也有效。
更进一步刚刚试过,
直接把ICollectionView属性标注:
//private ICollectionView EmployeesSource
//{
// get { return _employeesSource; }
// set { _employeesSource = value; }
//}
//private ICollectionView _employeesSource;
然後window建构式里面改写成
ICollectionView Employee在建构式执行完应就会被销毁的形式:
ICollectionView EmployeesSource =
CollectionViewSource.GetDefaultView(Employees) ;
EmployeesSource.GroupDescriptions.Add(new
PropertyGroupDescription("HireDate"));
}
经测试竟然建构结束,UI出现後,也可以正常分Group,
有可能GetDefaultView可以直接对集合的default view做出影响,
并保留在整个程式生命周期
如有讨论点或错误之处再请告知
: 各位好,
: 我有资料需要分组, 所以我用了listbox 搭配CollectionViewSource的group去分类
: group heaer的layout有一个delete的image可以删除整个group
: 但是现在有需求是如果目前正在删除中,
: 这个delete image要把他disable 或是 隐藏起来
: 所以我在delete image的tag属性让它bing住group item本身,
: 这样我在delete image 按下时可以拿到group item的datacontext是CollectionViewGroup
: 所以我想客制化CollectionViewGroup, 多加一个属性进去CollectionViewGroup去控制
: delete image的visibility
: 找到网路上有人做类似的客制化
: 但我目前遇到如果我动态增加一笔资料时, UI就不会更新,
: 不知道是哪边漏了实作, 希望有人帮我解答或是什麽关键字可以找到资料, 谢谢各位
: 程式码
: https://pastebin.com/GEJ5yMWd
--
~
Sent from my
PCMan Combo ~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.36.97.231
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1506020454.A.FA6.html
※ 编辑: name2name2 (114.36.97.231), 09/22/2017 03:23:31
1F:推 JGC18: 谢谢name2name2大大的回应, 的确在code里面加上群组也能达 09/22 15:43
2F:→ JGC18: 到分组效果, 不过因为我想直接操控group header的layout 09/22 15:43
3F:→ JGC18: 所以才想说要客制化CollectioViewGroup.只要把xaml里面的 09/22 15:44
4F:→ JGC18: CollectionViewType="local:EmployeeCollectionView"不要 09/22 15:45
5F:→ JGC18: 指定到客制的类别, add分组一切正常.後来只好直接在code里 09/22 15:46
6F:→ JGC18: 只接找header里面的image去更改他的visibility 09/22 15:47
感谢回覆,现在才发现我看到UI上Add按钮後就只想着按下add後如何更新UI,
忽略前面大篇幅image header等的描述
刚也试过去掉CollectionViewType就可更新,
由此知我原推测resource没PropChange不太正确
之後如有其他进展再放上来
※ 编辑: name2name2 (114.42.217.224), 09/22/2017 20:37:56
※ 编辑: name2name2 (114.42.78.167), 10/06/2017 23:06:16