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;
}