入门值转换器挂起转换并一次又一次地转换回来

Entry value converter hangs converting and converting back again and again

我有一个 Entry,其中包含 价格,我想将其格式化为货币。
这是 Entry 标签

<Entry x:Name="Price" StyleId="Price"  
       Text="{Binding Model.Price, Converter={StaticResource CurrencyEntryFormatConverter}, Mode=TwoWay}"
       Placeholder="{x:Static resx:Resources.PricePlaceholder}"
       Style="{StaticResource DefaultEntry}" Keyboard="Numeric"/>

这里是 Model

中的 属性
public decimal Price
{
    get
    {
        return this.price;
    }

    set
    {
        if (this.price== value)
        {
            return;
        }

        this.price= value;
        this.OnPropertyChanged();
    }
}

最后是转换器:

public class CurrencyEntryFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
        {
            return value;
        }

        string result = string.Format(Resources.CurrencyFormatString, (decimal)value);
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
        {
            return 0;
        }

        string result = value.ToString().Replace(" ", "").Replace("$", "").Replace(",", "");
        return result;
    }
}

问题: 我的问题是,当我 运行 项目并尝试在价格字段中输入值时,代码在 之间重复执行转换器和应用程序的 ConvertConvertBack 函数挂起!
有什么建议吗?

在我的例子中,问题是 属性 实现
如果我们定义一个 class 的 属性 实现 INotifyPropertyChanged,为了在 属性 值改变时更新视图,我们需要调用 OnPropertyChanged set 块中的方法:

public decimal Amount
{
    get
    {
        return this.amount;
    }

    set
    {
        this.amount = value;
        this.OnPropertyChanged();  // like this line
    }
}

但是像这样的代码会与您的绑定形成一个循环。所以我们需要检查该值是否与当前 属性 的值不同,如果是新值,则更新它。看这段代码:

public decimal Amount
{
    get
    {
        return this.amount;
    }

    set
    {
        if (this.amount == value)
        {
            return;
        }

        this.amount = value;
        this.OnPropertyChanged();
    }
}

if 块可以帮助您停止在 getset 之间循环。 我希望它能帮助某人。