ViewModel 更新中断用户与绑定 TextBox 的交互
ViewModel updates interrupts user interaction with bound TextBox
我遇到了用户输入被绑定 ViewModel 的更新中断的问题。
ViewModel 公开了一个数值 ,它每秒都在变化。 这绑定到视图中的 TextBox
。我们希望 TextBox
显示这个值,它做得很好。
但是,当用户单击 TextBox
并尝试输入新值时,模型中的值会更新,导致用户在文本框中输入的值被覆盖。
如何最轻松地解决这个问题,在同一控件中支持用户输入和定期更新?我将不胜感激代码示例 (C# / XAML).
如果您需要更多详细信息,请询问 :)
当 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 并单击 Button,因此文本框失去焦点并将值发送到名称 属性。调试打印以下序列:
1
2个
3个
56
4
我遇到了用户输入被绑定 ViewModel 的更新中断的问题。
ViewModel 公开了一个数值 ,它每秒都在变化。 这绑定到视图中的 TextBox
。我们希望 TextBox
显示这个值,它做得很好。
但是,当用户单击 TextBox
并尝试输入新值时,模型中的值会更新,导致用户在文本框中输入的值被覆盖。
如何最轻松地解决这个问题,在同一控件中支持用户输入和定期更新?我将不胜感激代码示例 (C# / XAML).
如果您需要更多详细信息,请询问 :)
当 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 并单击 Button,因此文本框失去焦点并将值发送到名称 属性。调试打印以下序列:
1 2个 3个 56 4