ObservableCollection 项目不显示更新

发布于 2024-10-18 21:19:03 字数 2052 浏览 4 评论 0原文

我想要一个可以显示项目的“希腊语”或“英语”名称的项目列表,具体取决于用户在两者之间切换。列表中的所有项目都实现 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);
    }

}

I want a list of items that can display either an item's 'greek' or 'english' name, depending on a user toggling between the two. All of the items in the list implement INPC.

Since each item has a GreekName property and an RomanName property, the strategy I am using is to simply change the items DisplayName property. Unit tests and log output indicate that the DisplayName for each item does change and does fire INPC, but the list does not update.

The list is an ObservableCollection. I am wondering if this fails to update because the hash code doesn't change? Does that mean that the only way to replace the item in the list with a new one?

Some code below...

Cheers,
Berryl

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

总以为 2024-10-25 21:19:03

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

My idiocy - my databinding was off. The code was fine and the view updates by virtue of it's items firing INPC, as expected.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文