WPF - MVVM - 文本框与viewmodel属性不同步

Ste*_*orn 9 .net data-binding wpf mvvm viewmodel

我有一个带有TextBox的WPF视图,将Text字段绑定到一个ViewSodel,并将UpdateSourceTrigger设置为PropertyChanged.在ViewModel的属性设置器中,我有一个简单的检查,以防止文本超过10个字符:

<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new MainViewModel();
    }
}


public string Name
{
    get { return _Name; }
    set
    {
        if (_Name != value)
        {
            if (value.Length <= 10)
            {
                _Name = value;
            }
            RaisePropertyChanged("Name");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有设置该值,我仍然是RaisePropertyChanged(它只是触发PropertyChanged).

问题是当我在UI中输入第11个字符时,我不会更新_Name.我触发了PropertyChanged,我可以看到get访问器被调用,它返回的字符串只有10个字符.但是,我的TextBox没有反映这一点; 它仍然显示11个字符的字符串.

最重要的是,如果在第11个字符上我将setter中的文本更改为"ERROR",并且fire属性发生了更改,则TextBox会更新以显示更改的文本.

那么为什么如果我将setter中的文本更改回前一个值,那么UI不反映这个?

我知道有其他方法可以处理最大字符,但为什么这不起作用?

Fre*_*lad 23

这只不过是框架中的一个错误.该Text属性TextBox确实获得了新值,但GUI现在与其自身不同步TextProperty.ItemsControl当你想取消SelectedItemViewModel 的更改并且它真的很烦人时,这也会发生.

使用显式时不会发生此错误,Binding因此可以将其用作解决方法.

XAML

<TextBox Text="{Binding Path=MyName,
                        UpdateSourceTrigger=Explicit}"
         TextChanged="TextBox_TextChanged"/>
Run Code Online (Sandbox Code Playgroud)

代码背后

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    TextBox textBox = sender as TextBox;
    textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
Run Code Online (Sandbox Code Playgroud)

要验证TextBox GUI确实不同步,只需观察值TextBox.Text.该TextBox会说"123456789___0"例如,而TextBlock说"123456789".

<StackPanel>
    <TextBox Name="myTextBox"
             Text="{Binding Path=MyName,
                            UpdateSourceTrigger=PropertyChanged}"/>
    <TextBlock Text="{Binding ElementName=myTextBox, Path=Text}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)