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

.net 使用WPF双向数据绑定时更改setter属性中的值,.net,wpf,data-binding,.net,Wpf,Data Binding,我有一个文本框,它绑定到实体对象的文本属性。 我希望能够在某些情况下重新格式化用户输入的文本-例如,如果用户输入“2/4”(分数)-我希望将其更改为“1/2” 通过文本属性的“设置部分”,我可以更改实体对象上的值,但该值不会出现在文本框中–它仍然显示为“2/4”您是否实现了INotifyPropertyChanged并调用了它 private string _fraction; public string Fraction { get { return

我有一个文本框,它绑定到实体对象的文本属性。 我希望能够在某些情况下重新格式化用户输入的文本-例如,如果用户输入“2/4”(分数)-我希望将其更改为“1/2”


通过文本属性的“设置部分”,我可以更改实体对象上的值,但该值不会出现在文本框中–它仍然显示为“2/4”

您是否实现了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));
        }
    }

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

您可以通过调用以下命令强制文本框刷新其绑定:

textBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
但困难在于找到一个好的地方将其纳入其中。显然,您的数据对象无法执行此操作,因为它没有对TextBox实例的引用。您可以通过将文本框链接到数据对象的PropertyChanged事件处理程序,在保存文本框的窗口中执行此操作,但这感觉不是很干净

如果我想到更好的解决方案,我会编辑这个响应,但至少这解释了绑定不起作用的原因


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

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

似乎会改变行为,以便在setter触发PropertyChanged事件时,它会注意到该事件



作为补充(32个月后),这种行为已经过时,您将不再需要IsAsync。

添加
IsAsync=true
对我来说很有效,但由于我的属性现在被非GUI线程使用,因此导致了一些跨线程异常。如果添加<代码> ISASYNC=Trime,请确保考虑线程复杂度。或者,改用这个:@Joe,谢谢你的链接!仅仅添加
IsAsync=true
对我来说不起作用,但是添加
Converter={StaticResource IdentityConverter}
(以及转换器本身)就成功了@马丁,谢谢你的更新!我没有意识到我的应用程序仍然在.NETFramework3.5上。切换到.NET Framework 4确实解决了我的问题,因此没有添加
IsAsync=…
Converter=…
:]是的。但在.NET3.5中更改文本框输入时不会发生任何事情