MVVM UpdateSourceTrigger

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

Представление содержит несколько текстовых полей, привязанных к свойствам в NetworkConfigViewModel:

<TextBox>
    <TextBox.Text>
        <Binding Path="IP" UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
</TextBox>

... etc

Представление также содержит кнопку под названием Save Configuration, Кнопка привязана к RelayCommand в ViewModel, которая заботится о сохранении конфигурации на удаленном устройстве по запросу.

Я хотел бы изменить привязки текстового поля для использования UpdateSourceTrigger="Explicit" так что ViewModel обновляется только тогда, когда пользователь явно нажимает "Сохранить конфигурацию", а не обновляется по мере изменения значений.

Я понимаю, что мне нужно позвонить BindingExpression.UpdateSource() для каждого текстового поля. Как я могу сделать это с помощью MVVM? Добавление новой команды RelayCommand в ViewModel, которая знает об элементах пользовательского интерфейса, кажется неправильным.

3 ответа

Итак, вернемся к вашему примеру:

Если ViewModel имеет закрытые поля поддержки для своих свойств вместо того, чтобы выставлять свойства модели, как

private string _myProperty;

public string MyProperty
{

    get { return _myProperty; }
    set
    {
        if (_myProperty != value)
        {
            _myProperty = value;
            OnPropertyChanged("MyProperty");
        }
    }
}

С чем будут связаны элементы управления в представлении? Если вы свяжетесь со свойством, которое предоставляет только частное вспомогательное поле, как любые данные попадут в представление? Например, TextBox больше не может привязываться к свойству ViewModel, MyProperty, потому что он не предоставляет Model.MyProperty. Это просто разоблачение _myProperty. Если вы делаете привязку к Model.MyProperty, как это происходит в представлении:

<TextBox Text="{Binding Model.MyProperty, UpdateSourceTrigger=Explicit}" />
<Button Command="{Binding SaveCommand}" />

... вы получите данные в TextBox. Теперь, как нам обновить модель с обновленным значением из TextBox при нажатии кнопки Сохранить?

private void SaveExecute()
{
    // How do we update the Model.MyProperty value?
}

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

Я предполагаю, что вы задаете этот вопрос, потому что вы реализовали модель представления с такими свойствами:

public string MyProperty
{
   get { return _Model.MyProperty; } 
   set
   {
      _Model.MyProperty=value;
      OnPropertyChanged("MyProperty");
   }
}

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

Точнее, слишком много знать ViewModel о View - не очень хорошо. Я бы лучше обновил копию настроек, и пусть связывание сделает все для меня. Когда пользователь нажимает кнопку "Сохранить конфигурацию", я распространяю изменения в хранилище, модель или что-то еще...

Другие вопросы по тегам