4

我有GridView一些列显示材料。viewmodel 值都以 kg 为单位保存,因为某些视图应转换并显示为升。使用IMultiValueConverter.

public object Convert(object[] values, ...){
    var valueInKg = (double)values[0];
    var density = (double)values[1];

    return valueInKg/density;
}

现在我在进行向后转换时遇到问题。我试图将输入值(密度)存储在转换器中,但确实有它的单个实例,因此有时密度值错误。我找到了这个 x:shared="false" 方法,但想将转换器设置在派生自System.Windows.Data.MultiBinding.

public class MyBinding : MultiBinding {
    public MyBinding(){
        Converter = new MyConverter();
    }
}

我认为这将导致每个 Binding 都有一个单独的实例——它不会。我怎样才能做到这一点?

编辑:正如 mm8 在此答案中所建议的,问题在于绑定实例。在其单元格模板中定义 a 上的绑定时,GridViewColumn我将每列仅点击构造函数一次。所以问题是我怎样才能改变它——它甚至可能吗?

4

2 回答 2

0

我认为这将导致每个 Binding 都有一个单独的实例——它不会。

下面肯定会创建一个新的MyConverter类实例:

Converter = new MyConverter();

确保MyBinding为每个绑定创建类的新实例。

您还可以像这样在 XAML 中创建转换器的新实例:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding>
            <MultiBinding.Converter>
                <local:MyConverter />
            </MultiBinding.Converter>
            <Binding Path="Test" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>
于 2017-03-13T11:43:05.663 回答
0

关于在方法中保持值ConvertBack:如果我理解正确,您可以Binding.DoNothingConvertBack函数中使用。例子:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace Example.Converter
{
    public class StringFormatConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            // object[] values per index
            // 0 ... some value 1
            // 1 ... some value 2

            // ... do amazing stuff with values

            return "hello world";
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            try
            {
                // here: don't change source's "some value 1", and assign ToDecimal result to source's "some value 2"
                return new object[] {Binding.DoNothing, System.Convert.ToDecimal(value, culture) };
            }
            catch (Exception e)
            {
                // do not change anything in the source
                return new object[] {Binding.DoNothing, Binding.DoNothing};
            }
        }
    }
}
于 2018-08-28T13:06:56.770 回答