ViewModel обновляет прерывания взаимодействия пользователя со связанным TextBox

48
7

У меня возникла проблема, когда пользовательский ввод прерывается обновлениями из связанной ViewModel.

ViewModel предоставляет числовое значение, которое меняется каждую секунду. Это связано с TextBox в представлении. Мы хотим, чтобы TextBox отображал это значение, и это хорошо.

Однако, когда пользователь нажимает на TextBox и пытается ввести новое значение, значение в модели обновляется, что заставляет перезаписываемое пользователем значение в текстовом поле перезаписываться.

Как я могу наиболее легко решить эту проблему, поддерживая ввод пользователя и регулярные обновления в одном элементе управления? Я был бы признателен за примеры кода (С#/XAML).

Если вам нужно больше деталей, просто спросите :)

спросил(а) 2015-07-09T19:26:00+03:00 4 года, 5 месяцев назад
1
Решение
49

Когда TextBox получает фокус (свойство IsFocused равно true), я меняю тип привязки, чтобы он не обновлялся, если он не потерял фокус.

ViewModel:

 class MainViewModel : INotifyPropertyChanged
{
private string _name;

public string Name
{
get { return _name; }
set
{
_name = value;
Debug.WriteLine(value);
OnPropertyChanged();
}
}

public MainViewModel()
{
Task.Factory.StartNew(async () =>
{
for (int i = 0; i < 1000; i++)
{

Name = i.ToString();
await Task.Delay(3000);
}
});
}

public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

public event PropertyChangedEventHandler PropertyChanged;
}

XAML:

<StackPanel>
<TextBox>
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="Text" Value="{Binding Name, Mode=OneWay}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsFocused}" Value="True">
<Setter Property="Text" Value="{Binding Name, Mode=OneWayToSource, UpdateSourceTrigger=LostFocus}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<Button Content="Click"/>
</StackPanel>

Я получил последовательность 2,3, затем я ввел 56 и нажал кнопку, чтобы текстовое поле потеряло фокус и отправило значение в свойство Name. Отладка напечатала следующую последовательность:

1 2 3 56 4

ответил(а) 2015-07-09T20:11:00+03:00 4 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема