ListView 绑定 更改通知
我为一个ListView定义了如下的CollectionViewSource:
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="GroupSettingID" Converter="{StaticResource GetGroupSettingByPlayerConverter}"/>
</CollectionViewSource.GroupDescriptions>
其中的
PropertyGroupDescription PropertyName="GroupSettingID" Converter="{StaticResource GetGroupSettingByPlayerConverter}"/>
指向一个自定义的 GroupSettingID , 转换器通过此ID在一个列表中将与ID对应的GroupSetting的Name属性返回。
有没有什么办法,当对应的GroupSetting中的Name属性改变时,PropertyGroupDescription的属性一起改变?
[解决办法]
是不是CollectionViewSource或者ICollectionView.Refresh()一下的问题呀?
[解决办法]
中午我大概的试了一下。把CollectionViewSource放在VM里。
然后当Group条件变化时,比如ComboBox(显示Group条件)双向绑定VM里的自定义的某个属性,当这个属性变化时在它的set{}里先把CVS.GroupDescriptions.Clear(),然后再Add新选择的条件。界面会立即反应,无需ICollectionView.Clear().
顺便说一下,我做的过程中有个东西绊了我好长时间。就是CollectionViewSource严格讲并不是ICollectionView的实现(对应的PagedCollectionView,DomainCollectionView应该是吧)。所以GroupDescriptions必须Add到CVS的GroupDescriptions上。而我开始时,是这样做的。
public ICollectionView CollectionView
{
get
{
return CreateView(_Context.MyEntities);
}
}
public ICollectionView CreateView(IEnumerable source)
{
CollectionViewSource cvs = new CollectionViewSource();
cvs.Source = source;
return cvs.View;
}
然后我一直试图通过CollectionView来增加GroupDescriptions,结果失败。
[解决办法]
public class MainPageViewModel : NotificationObject{ private XXXDomainContext _Context = new XXXDomainContext(); private CollectionViewSource cvs; IEnumerable<string> groupSettings; public IEnumerable<string> GroupSettings { get { if (groupSettings == null) groupSettings = new List<string> { "分组条件1", "分组条件2" }; return groupSettings; } } private string currentSetting; public string CurrentSetting { get { return currentSetting; } set { if (currentSetting != value) { currentSetting = value; RaisePropertyChanged(() => this.CurrentSetting); cvs.GroupDescriptions.Clear(); cvs.GroupDescriptions.Add(new PropertyGroupDescription(currentSetting)); } } } public MainPageViewModel() { if (!DesignerProperties.IsInDesignTool) _Context.Load(_Context.GetXXXQuery(), lo => { CurrentSetting = "分组条件2"; }, null); } public ICollectionView CollectionView { get { return CreateView(_Context.XXX); } } public ICollectionView CreateView(IEnumerable source) { if (cvs == null) cvs = new CollectionViewSource(); cvs.Source = source; return cvs.View; }
[解决办法]