【发布时间】:2022-01-11 22:38:08
【问题描述】:
在下面的代码中,我尝试使用转换器将“RateValue”显示为小数和百分比。
下面的 GridColumn 代码位于 ComboBoxEdit 弹出模板中。
我看到的是,当添加所有 GridColumns 时,底层的“RateValue”最终在两种情况下都是相同的。但是,当我只有一个或另一个时,它们会显示正确的值。
因此,两者兼有似乎正在改变基础源值。
我在这里遗漏了什么明显的东西吗?
谢谢
<dxg:GridColumn MinWidth="80" Header="Rate (%)">
<dxg:GridColumn.Binding>
<Binding Path="RateValue" Converter="{StaticResource DecimalToFourDecimalPlacesPercentageConverter}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
</dxg:GridColumn.Binding>
</dxg:GridColumn>
<dxg:GridColumn Header="Rate (Decimal)">
<dxg:GridColumn.Binding>
<Binding Path="RateValue" Converter="{StaticResource DecimalToFourDecimalPlacesConverter}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
</dxg:GridColumn.Binding>
</dxg:GridColumn>
<converters1:NumericToStringConverter x:Key="DecimalToFourDecimalPlacesPercentageConverter" Format="0:N4" Multiplier="100"/>
<converters1:NumericToStringConverter x:Key="DecimalToFourDecimalPlacesConverter" Format="0:N4" Multiplier="1"/>
public class NumericToStringConverter : IValueConverter
{
private static readonly ILog Logger = LogManager.GetLogger(typeof(NumericToStringConverter));
public string Format { get; set; }
public int Multiplier { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is decimal)) return Binding.DoNothing;
try
{
var v = (decimal?) value;
return string.Format("{" + Format + "}", Multiplier*v);
}
catch (FormatException ex)
{
Logger.Error(string.Format("Failed to format '{0}'", value), ex);
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
【问题讨论】:
-
请注意,在 OneWay 绑定上设置
UpdateSourceTrigger="PropertyChanged"是没有意义的。 UpdateSourceTrigger 仅影响 TwoWay 或 OneWayToSource 绑定。 -
是的,这是有道理的。我只是在添加更改以查看它们是否会产生任何影响。但是就像你说的那样,一次性绑定并不关心源是否更新。谢谢
-
“一次性绑定不关心源是否更新”——我不是这么说的。 UpdateSourceTrigger 控制当 target 属性更改时会发生什么,或者更准确地说,源属性如何以及何时由于目标属性的更改而更新。这仅与确实更新其源属性的绑定相关,即 TwoWay 和 OneWayToSource。所有其他绑定,例如普通的OneWay,不要那样做。
标签: c# wpf converters