我遇到的问题是用户输入被绑定的ViewModel更新中断。
ViewModel公开了一个数值,每秒都会更改。这与视图中的TextBox
绑定。我们希望TextBox
显示此值,它表现良好。
但是,当用户点击TextBox
并尝试输入新值时,模型中的值会更新,这会导致文本框中用户输入的值被覆盖。
如何在同一控件中最轻松地解决此问题,支持用户输入和定期更新?我很感激代码示例(C#/ XAML)。
如果您需要更多详细信息,请询问:)
答案 0 :(得分:1)
当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