【问题标题】:Multiple Converter based on same property updating undelrying value基于相同属性的多个转换器更新取消值
【发布时间】: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


【解决方案1】:

我不熟悉 DevExpress 的 WPF 控件,但假设它们像官方一样工作,不需要转换器,StringFormat 应该足够了。

<dxg:GridColumn MinWidth="80" Header="Rate (%)">
    <dxg:GridColumn.Binding>
        <Binding Path="RateValue" StringFormat="P4"/>
    </dxg:GridColumn.Binding>
</dxg:GridColumn>

<dxg:GridColumn Header="Rate (Decimal)">
    <dxg:GridColumn.Binding>
        <Binding Path="RateValue" StringFormat="N4"/>
    </dxg:GridColumn.Binding>
</dxg:GridColumn>

如果这不起作用,请将转换器更改为

public class NumericToStringConverter : IValueConverter
{
    private static readonly ILog Logger = LogManager.GetLogger(typeof(NumericToStringConverter));

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            return string.Format(parameter.ToString(), value);
        }
        catch (FormatException ex)
        {
            Logger.Error($"Failed to format {value}", ex);
        }

        return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后将其他部分改为

<dxg:GridColumn MinWidth="80" Header="Rate (%)">
    <dxg:GridColumn.Binding>
        <Binding Path="RateValue" Converter="{StaticResource MyDecimalToStringConverter}"
            ConverterParameter="P4"/>
    </dxg:GridColumn.Binding>
</dxg:GridColumn>

<dxg:GridColumn Header="Rate (Decimal)">
    <dxg:GridColumn.Binding>
        <Binding Path="RateValue" Converter="{StaticResource MyDecimalToStringConverter}"
            ConverterParameter="N4"/>
    </dxg:GridColumn.Binding>
</dxg:GridColumn>

<converters1:NumericToStringConverter x:Key="MyDecimalToStringConverter"/>

【讨论】:

  • 谢谢 - 第一个选项不起作用,但修改转换器是我所拥有的更清洁的解决方案。出于某种原因,即使使用第一个选项,基础值也会显示相同的 % 格式。
  • 我赞成您的回答,但两列显示相同值的根本原因仍然存在。
  • @CiaranMartin 抱歉,由于没有 DevExpress 工具包,我无法进行任何测试。但仍然很乐意提供帮助。
  • 没问题,亚历克斯。感谢您迄今为止的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多