入门值转换器挂起转换并一次又一次地转换回来
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;
}
}
问题: 我的问题是,当我 运行 项目并尝试在价格字段中输入值时,代码在 之间重复执行转换器和应用程序的 Convert 和 ConvertBack 函数挂起!
有什么建议吗?
在我的例子中,问题是 属性 实现
如果我们定义一个 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 块可以帮助您停止在 get 和 set 之间循环。
我希望它能帮助某人。
我有一个 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;
}
}
问题: 我的问题是,当我 运行 项目并尝试在价格字段中输入值时,代码在 之间重复执行转换器和应用程序的 Convert 和 ConvertBack 函数挂起!
有什么建议吗?
在我的例子中,问题是 属性 实现
如果我们定义一个 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 块可以帮助您停止在 get 和 set 之间循环。 我希望它能帮助某人。