Элементы ObservableCollection, не отображающие обновления - PullRequest
0 голосов
/ 23 февраля 2011

Мне нужен список элементов, которые могут отображать либо «греческое», либо «английское» имя элемента, в зависимости от того, как пользователь переключается между ними.Все элементы в списке реализуют INPC.

Поскольку каждый элемент имеет свойство GreekName и свойство RomanName, стратегия, которую я использую, заключается в простом изменении свойства элементов DisplayName.Модульные тесты и выходные данные журнала показывают, что DisplayName для каждого элемента изменяется и запускает INPC, но список не обновляется.

Список представляет собой ObservableCollection.Мне интересно, если это не удается обновить, потому что хэш-код не меняется?Означает ли это, что единственный способ заменить элемент в списке новым?

Некоторый код ниже ...

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

}

1 Ответ

0 голосов
/ 26 февраля 2011

Мой идиотизм - моя привязка данных отключена. Код был в порядке, и представление обновляется благодаря его элементам, запускающим INPC, как и ожидалось.

...