Хобрук: Ваш путь к мастерству в программировании

Обновление свойства только для чтения (связанного) в MVVM

Я думаю, это должно быть легко, но я не могу этого понять.

Возьмите эти свойства из примера ViewModel (ObservableViewModel реализует INotifyPropertyChanged):

class NameViewModel : ObservableViewModel
{ 
    Boolean mShowFullName = false;
    string mFirstName = "Wonko";
    string mLastName = "DeSane";
    private readonly DelegateCommand mToggleName;

    public NameViewModel()
    {
        mToggleName = new DelegateCommand(() => ShowFullName = !mShowFullName);
    }

    public ICommand ToggleNameCommand
    {
        get { return mToggleName; }
    }

    public Boolean ShowFullName
    {
        get { return mShowFullName; }
        set { SetPropertyValue("ShowFullName", ref mShowFullName, value); }
    }

    public string Name
    {
        get { return (mShowFullName ? this.FullName : this.Initials); }
    }

    public string FullName
    {
        get { return mFirstName + " " + mLastName; }
    }

    public string Initials
    {
        get { return mFirstName.Substring(0, 1) + "." + mLastName.Substring(0, 1) + "."; }
    }
}

Суть такого [вставьте здесь прилагательное] Представление с использованием этой ViewModel может выглядеть так:

<TextBlock x:Name="txtName"
           Grid.Row="0"
           Text="{Binding Name}" />

<Button x:Name="btnToggleName"
        Command="{Binding ToggleNameCommand}"
        Content="Toggle Name"
        Grid.Row="1" />

Проблема, которую я вижу, заключается в том, что запускается ToggleNameCommand. Свойство ShowFullName правильно обновляется командой, но привязка Name никогда не обновляется в представлении.

Что мне не хватает? Как принудительно обновить привязку? Нужно ли мне реализовать свойства Name как DependencyProperties (и, следовательно, унаследовать от DependencyObject)? Мне кажется немного тяжеловесным, и я надеюсь на более простое решение.

Спасибо, wTs


Ответы:


1

Вам необходимо явно уведомить об изменении имени, иначе система привязки не сможет узнать об этом. Вы можете либо вызвать NotifyPropertyChanged для свойства «Name» при установке ShowFullName, либо вы можете изменить свойство Name, чтобы иметь частный установщик и обновить его явно (вызывая NotifyPropertyChanged как часть установщика свойства Name), вместо того, чтобы геттер оценивал значение функция.


Обратите внимание, что вам нужно сделать то же самое для двух других свойств, доступных только для чтения. Создание их свойств зависимостей также будет работать, но я предпочитаю избегать этого, если я не реализую элемент управления, который будет целью для привязки. Они тяжелые, если вам нужно только уведомление об изменении свойства.

13.05.2010
  • Дох! Конечно! +1 для вас, -1 для меня. :) По крайней мере, я был прав насчет реализации DP и причины, по которой ее следует избегать. 13.05.2010
  • Я сталкивался с этой проблемой раньше, поскольку это обычная проблема, когда у вас есть несколько свойств, которые представляют собой разные представления одних и тех же базовых данных. Я склонен следовать получению; частный набор; подходить сейчас и инкапсулировать обновление в метод RefreshX, вызываемый всякий раз, когда изменяется одно из базовых свойств. Для меня это чище, поскольку я использую PostSharp для реализации INotifyPropertyChanged, и таким образом мне не нужно создавать новый явный вызов OnPropertyChanged. 13.05.2010
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.