ViewModel更新中断用户与绑定TextBox的交互

时间:2015-07-09 16:26:01

标签: c# wpf mvvm wpf-controls wcf-binding

我遇到的问题是用户输入被绑定的ViewModel更新中断。

ViewModel公开了一个数值,每秒都会更改。这与视图中的TextBox绑定。我们希望TextBox显示此值,它表现良好。

但是,当用户点击TextBox并尝试输入新值时,模型中的值会更新,这会导致文本框中用户输入的值被覆盖。

如何在同一控件中最轻松地解决此问题,支持用户输入和定期更新?我很感激代码示例(C#/ XAML)。

如果您需要更多详细信息,请询问:)

1 个答案:

答案 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