【问题标题】:ObservableCollection items not showing updatesObservableCollection 项目未显示更新
【发布时间】:2011-07-02 09:32:42
【问题描述】:

我想要一个项目列表,可以显示项目的“希腊语”或“英语”名称,具体取决于用户在两者之间切换。列表中的所有项目都实现了 INPC。

由于每个项目都有一个 GreekName 属性和一个 RomanName 属性,我使用的策略是简单地更改项目的 DisplayName 属性。单元测试和日志输出表明每个项目的 DisplayName 确实发生了变化并触发了 INPC,但列表没有更新。

列表是一个 ObservableCollection。我想知道这是否因为哈希码没有改变而无法更新?这是否意味着将列表中的项目替换为新项目的唯一方法?

下面的一些代码...

干杯,
浆果

public class MasterViewModel : ViewModelBase
{

    public ObservableCollection<DetailVm> AllDetailVms
    {
        get { return _allDetailVms; }
    }
    private readonly ObservableCollection<DetailVm> _allDetailVms;

    void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
        if (e.NewItems != null && e.NewItems.Count != 0) 
            foreach (DetailVm vm in e.NewItems) vm.PropertyChanged += OnGreekGodChanged;

        if (e.OldItems != null && e.OldItems.Count != 0) 
            foreach (DetailVm vm in e.OldItems) vm.PropertyChanged -= OnGreekGodChanged;
    }

    private void OnGreekGodChanged(object sender, PropertyChangedEventArgs e)
    {
        var detailVm = (DetailVm)sender;

        // if DisplayName has changed we want to refresh the view & its filter
        var displayName = ExprHelper.GetPropertyName<DetailVm>(x => x.DisplayName);
        if (e.PropertyName == displayName) 
            Log.Info("'{0} reports it's display name has changed", detailVm.DisplayName);
    }


    private void _flipGreekOrRomanDisplay(string newName, Func<DetailVm, string> property) 
    {
        foreach (var detailVm in _allDetailVms)
        {
            Log.Info("To '{0}', before change: '{1}'", newName, detailVm.DisplayName);
            detailVm.DisplayName = property(detailVm);
            Log.Info("To '{0}', after change: '{1}'", newName, detailVm.DisplayName);
        }
        NameFilterLabelText = newName;
        NotifyOfPropertyChange(() => NameFilterLabelText);

        NotifyOfPropertyChange(() => UseGreekName);
        NotifyOfPropertyChange(() => UseRomanName);
    }

}

【问题讨论】:

    标签: wpf silverlight data-binding observablecollection


    【解决方案1】:

    我的白痴 - 我的数据绑定已关闭。代码很好,并且视图通过它的项目触发 INPC 来更新,正如预期的那样。

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 2012-07-04
      • 1970-01-01
      • 2011-11-17
      • 2015-04-09
      相关资源
      最近更新 更多