Привет всем. Поскажите пожалуйста, у меня страница, к которой привязан соответствующий VM со свойствами Width, Height и Depth. Эти свойства привязаны к 3-ем контролам TextBox. Все эти 3 свойства зависимы между собой: если изменяю одно, изменяются остальные два. Как мне привязать их так к контролам TextBox, чтобы при процессе ввода текста в какой-либо, обновлялся текст в двух других. Суть в том, что у меня двусвязная привязка свойств к контролам, но обновление этих контролов происходит только после валидации, тоесть когда оно потеряет фокус. А мне нужно, чтобы после каждого введенного/удаленного символа из TextBox происходило обновление.
Естественно, хотелось бы услышать в рамках MVVM
Установите в привязке UpdateSourceTrigger в значение PropertyChanged:
<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}/>
Возможные значения перечислены здесь: Перечисление UpdateSourceTrigger
Если вы пользуетесь MVVM, то контролы должны лишь отражать состояние VM. Это значит, что не контролы должны быть привязаны друг к другу, а свойства VM.
А это уж делается очевидным, тривиальным образом.
class NameEditorVM : VM
{
string firstName, surname, composedName;
bool isUpdating = false;
public string FirstName
{
get => firstName;
set { if (Set(ref firstName, value) && !isUpdating) CalcComposedName(); }
}
public string Surname
{
get => surname;
set { if (Set(ref surname, value) && !isUpdating) CalcComposedName(); }
}
public string ComposedName
{
get => composedName;
set { if (Set(ref composedName, value) && !isUpdating) SplitComposedName(); }
}
void CalcComposedName()
{
isUpdating = true;
ComposedName = FirstName + " " + Surname;
isUpdating = false;
}
void SplitComposedName()
{
isUpdating = true;
string[] parts = ComposedName.Split();
FirstName = parts[0];
Surname = string.Join(" ", parts.Skip(1));
isUpdating = false;
}
}
Ну и не забудьте, как верно указал в ответе @Андрей, указать в привязке UpdateSourceTrigger=PropertyChanged.
P. S.: Использован стандартный базовый класс:
class VM : INotifyPropertyChanged
{
protected bool Set<T>(ref T field, T value,
[CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value))
return false;
field = value;
RaisePropertyChanged(propertyName);
return true;
}
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public event PropertyChangedEventHandler PropertyChanged;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей