【问题标题】:How to stop a WPF binding from ignoring the PropertyChanged event that it caused?如何阻止 WPF 绑定忽略它引起的 PropertyChanged 事件?
【发布时间】:2010-10-23 01:03:21
【问题描述】:

我有一个 TextBox 绑定到 ViewModel 的 Text 属性,设置如下:

Xaml

<TextBox Text="{Binding Text}"/>

C#

public class ViewModel : INotifyPropertyChanged
{
    public string Text
    {
        get
        {
            return m_Text;
        }
        set
        {
            if (String.Equals(m_Text, value))
            {
                return;
            }

            m_Text = value.ToLower();
            RaisePropertyChanged("Text");
        }
    }

    // Snip
}

当我在 TextBox 中输入一些内容时,它成功地设置了 ViewModel 上的 Text 属性。问题是 WPF 忽略了它自己的更新引发的属性更改事件。这会导致用户看不到他们键入的转换为小写的文本。

如何更改此行为以使 TextBox 更新为小写文本?

注意:这只是我用来说明 WPF 忽略事件问题的一个示例。我对将字符串转换为小写或 String.Equals(string, string) 的任何问题并不感兴趣。

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    您可以通过使用 Dispatcher.BeginInvoke 在单独的调度程序调用中引发事件来实现此目的

    定义一个委托:

    private delegate void RaisePropertyChangedDelegate(string property);
    

    然后使用以下来引发事件

    Dispatcher.CurrentDispatcher.BeginInvoke(
        DispatcherPriority.Normal,
        new RaisePropertyChangedDelegate(RaisePropertyChanged), 
        "Text");
    

    【讨论】:

    • 我不太喜欢这种解决方案,因为它要求绑定对象了解 Dispatcher。但是它确实解决了问题,所以我将其标记为答案。
    【解决方案2】:

    我记得 Rocky Lhotka 在 .NET Rocks 的老一集中抱怨过这种行为。 (搜索了半个小时……)啊,到了。 Episode 169 2006 年 3 月:

    所以如果你有一个详细的表格 然后你绑定所有的 Windows 窗体 你的属性对那些不同的 文本框和用户正在输入 将内容放入文本框并关闭标签, 当然,这个价值被投入 你的对象,但你的对象可能 改变值,可能有一些 一种说明一切的操纵 字母必须大写。它是 业务规则,因此它进入您的 目的。如果你这样做,它不会显示 在 UI 中。换句话说,用户 可以输入a、b、c,输入小写, 标签关闭。小写 a, b, c 将 留在文本框中。然后以后的时候 他们改变了一些其他领域,然后 他们会牢记目标 大写的值,对吧?所以 对象有一个大写的 a、b、c 的 UI 错误地显示小写, 用户然后更改其他一些 控制和选项卡关闭该控制,所有 突然 a, b, c 大写 显示在他们的文本框中 没有开启。

    Rocky 实际上并没有提出解决问题的方法,我敢说,如果他没有解决这个问题,可能就没有好的答案。也许您需要从代码隐藏中订阅对象的 PropertyChanged 事件,并在相关属性发生更改时手动刷新绑定。

    ps。这不是直接回答您的问题,但在您给出的示例中,您可以在 TextBox 上设置 CharacterCasing,以便它只接受小写字符。

    【讨论】:

    • 哈哈 - 我开始输入这个答案,然后出去喝茶。 5 小时后我回来,看到你更新了你的问题,抢先我谈论 CharacterCasing。那好吧。 ;-)
    【解决方案3】:

    显然,这已在 2010 年发布的 .NET Framework 4.0 中的 WPF 4.0 中得到修复:Karl Shifflett's blog

    【讨论】:

      【解决方案4】:

      您需要强制更新绑定目标(请参阅this post on MSDN)。但是,这在 WPF4 中已更改/损坏,因此您必须改为强制更新源(请参阅this post)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-18
        • 1970-01-01
        相关资源
        最近更新 更多