WPF - MVVM - 文本框与视图模型属性不同步

10

我有一个 WPF 视图,其中包含一个 TextBox,将其 Text 字段绑定到 ViewModel,并将 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");
        }
    }
}
如果值没有设置,我仍会调用RaisePropertyChanged(它只是触发属性更改)。
问题是当我在UI中输入第11个字符时,我没有更新_Name。 我触发了PropertyChanged事件,我可以看到get访问器被调用并返回只有10个字符的字符串。 但是,我的TextBox没有反映这一点;它仍然显示具有11个字符的字符串。
此外,如果在第11个字符上,我将setter中的文本更改为“ERROR”,并触发属性更改,则TextBox会更新以显示已更改的文本。
那么,如果我将setter中的文本更改回先前的值,为什么UI不会反映这一点呢?
我知道有处理最大字符的替代方法,但为什么这种方法行不通?
1个回答

24

这实际上是框架中的一个错误。在 TextBox 中的 Text 属性确实会获得您的新值,但 GUI 现在与其自身的 TextProperty 不同步。当您想要取消来自 ViewModel 的 SelectedItem 的更改时,对于任何 ItemsControl 也会发生这种情况,这真的很令人烦恼。

然而,如果使用显式的 Binding,则不会出现此错误,因此可以将其用作解决方法。

Xaml

<TextBox Text="{Binding Path=MyName,
                        UpdateSourceTrigger=Explicit}"
         TextChanged="TextBox_TextChanged"/>

代码后台

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

为了验证文本框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>

谢谢!你知道这个问题是否已经向总部报告了吗?如果没有,我会去报告。 - Steve Osborn
@SteveOsborn:哈哈,我不确定已经向总部报告了这个问题 :) 我之前查过,但是没有发现任何东西,不过确切的搜索关键词有些难以确定。你可以去报告一下,然后告诉我,我会给它点赞。 - Fredrik Hedblad
https://connect.microsoft.com/VisualStudio/feedback/details/745368/wpf-textbox-binding-doesnt-work-properly - Steve Osborn
好的,已点赞。等他们回复后,我会在那里发布解决问题的方法。 - Fredrik Hedblad
1
@Meleak - 感谢您指出这一点。我已经删除了我的帖子,以免混淆任何人。 - Jordan Parmer
@JordanParmer:谢谢你的点赞。至少你因此获得了“守纪律”徽章 :) 我也曾在类似情况下获得过那个徽章。 - Fredrik Hedblad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接