【问题标题】:silverlight - changing a value on property changedsilverlight - 更改属性值已更改
【发布时间】:2014-12-17 04:28:55
【问题描述】:

我有一个绑定到名为 Amount 的小数属性的文本框,以及一条规定 Amount 值不能大于 100 的业务规则。 这是使用适当的 MVVM 和 INotifyPropertyChanged 事件设置的。

    <TextBox Text="{Binding Amount, Mode=TwoWay, StringFormat=N2}" />

当金额值发生变化时,在属性集中,我正在检查金额是否 > 100。如果是,那么我将值设置为 100。

    private decimal _Amount;
    public decimal Amount
    {
        get { return _Amount; }
        set {
            if (value > 100)
                _Amount = 100
            else
                _Amount = value; 
            NotifyPropertyChanged("Amount");
        }
    }

问题是这个新值永远不会出现在文本框中,无论我抛出多少次 INotifyPropertyChangedEvent。

我尝试在 TexBbox 的 LostFocus 事件上抛出 INotifyPropertyChanged 事件,但这会使值重置为原始(未编辑)值。那是因为这个事件发生在值到达属性设置器之前。

谁能建议我让修改后的值正确显示的方法?

【问题讨论】:

    标签: silverlight binding textbox inotifypropertychanged


    【解决方案1】:

    我终于让它工作了。我没有在 setter 中重置值,而是处理了对象的 PropertyChangedEvent 并在那里重置了值。

    令人沮丧的是,此解决方案在调试期间无法正常工作,但一旦发布就可以正常工作。

    感谢所有回复的人。

    【讨论】:

      【解决方案2】:

      将 UpdateSourceTrigger 属性添加到文本框。

      <TextBox Text="{Binding Amount, Mode=TwoWay, StringFormat=N2, UpdateSourceTrigger=LostFocus}" />
      

      【讨论】:

      • 当我这样做时,用户会遇到一些奇怪的光标重新定位。例如,如果他们输入“1234”,则结果为“3412”,因为在他们输入时光标会重新定位到文本的开头。
      • 一旦用户开始输入 3,if 语句就会在你的 setter 中被命中。尝试使用 LostFocus 作为属性的值,而不是 PropertyChanged。
      • 不确定我理解你的意思。我曾尝试在 lostFocus 事件期间抛出 NotifyPropertyChange,但这会阻止用户更改值。
      • 我用更新的 UpdateSourceTrigger 值编辑了答案。一旦在字段中输入值 1234 并且字段失去焦点,就会调用 setter。
      • 失去焦点不是 Silverlight 中的有效选项。无论如何,谢谢,我确实设法让它工作。它在发布时的行为与在调试中运行时的行为不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2022-01-18
      • 1970-01-01
      • 2013-11-02
      • 2019-10-30
      相关资源
      最近更新 更多