Обновление доступного только для чтения (связанного) свойства в MVVM - PullRequest
2 голосов
/ 13 мая 2010

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

Взять эти свойства из примера 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) + "."; }
    }
}

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

<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 как DependencyProperties (и, следовательно, наследовать от DependencyObject)? Мне кажется, это немного тяжеловесно, и я надеюсь на более простое решение.

Спасибо, WTS

1 Ответ

1 голос
/ 13 мая 2010

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


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

...