使用WPF双向数据绑定时更改setter属性中的值

时间:2009-05-13 10:06:00

标签: .net wpf data-binding

我有一个TextBox,它绑定到Entity-object上的Text-property。 我希望能够重新格式化用户在某些情况下输入的文本 - 例如如果用户输入“2/4”(一小部分) - 我想将其改为“1/2”。

通过Text-property的“set-part”,我可以更改Entity-object上的值,但这不会出现在TextBox中 - 它仍然显示为“2/4”?

2 个答案:

答案 0 :(得分:15)

原因是WPF中的绑定系统是“智能”的,当您更改TextBox中的值时,它会假定PropertyChanged事件将为该属性触发并忽略它。

您可以通过调用:

强制TextBox刷新其绑定
textBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();

但困难在于找到一个好的地方来挂钩。显然你的数据对象不能这样做,因为它没有引用TextBox实例。你可以在保存TextBox的窗口中通过将它链接到数据对象的PropertyChanged事件处理程序来完成它,但这感觉不是很干净。

如果我想到一个更好的解决方案,我会编辑此响应,但至少这解释了原因绑定无效。


啊哈!将绑定更改为IsAsync = true:

<TextBox x:Name="textBox" Text="{Binding Path=TestData, IsAsync=true}"/>

似乎改变行为,以便 在设置者触发时触发PropertyChanged事件。


作为附录(32个月后),此行为已changed in .NET 4,您将不再需要IsAsync。

答案 1 :(得分:0)

您是否实现了INotifyPropertyChanged并将其调用?

    private string _fraction;

    public string Fraction
    {
        get { return _fraction; }
        set
        {
            _fraction = ReduceFraction(value);
            NotifyPropertyChanged("Fraction");
        }
    }

    private string ReduceFraction(string value)
    {
        string result = "1/2";
        // Insert reduce fraction logic here
        return result;
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }