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 - не очень хорошо. Я бы лучше обновил копию настроек, и пусть связывание сделает все для меня. Когда пользователь нажимает кнопку "Сохранить конфигурацию", я распространяю изменения в хранилище, модель или что-то еще...