首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

ListView 绑定 更改通知解决思路

2013-01-25 
ListView 绑定 更改通知我为一个ListView定义了如下的CollectionViewSource:CollectionViewSource.GroupD

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



根据ComboBox的选项,更新DataGrid的分组显示。

把XXXContext, GetXXXQuery, _Context.XXX改为你成对应的……
[解决办法]


三个表,雇员(Employee)、部门(Department)、兴趣(Hobby)。

我可以把雇员表接部门分组显示,可以按兴趣分组显示,也可以按部门、兴趣的组合分组显示。但这种情况下,按楼主的表达,GroupSettingId这个字段又貌似不应该出现在Employee表里。所以我在这里就跟不上楼主思路了。就是说我不知道GroupSettingId是哪儿来的。

热点排行