如何将第二个绑定值传递给用于Convert和ConvertBack的ValueConverter?

时间:2015-11-09 02:29:04

标签: c# wpf ivalueconverter imultivalueconverter

我们有一个独特的案例,我们需要在DataGrid列中显示自定义类型的值。自定义类型可以是以下三个值之一:数字,模拟和串行。

  • 数字代表模型中的“0”或“1”
  • 类比是'0'和'255'之间的整数
  • 序列只是字符串

对于模拟或连续出版物,我们只想在DataGrid的列中显示该值,对于这些类型,这些值是可编辑的,但对于存储为“0”和“1”的数字,我们希望将它们显示为字符串'True'或'False',并且它们不可编辑。

以下是Convert方法中我们需要的逻辑示例:

// In this example, 'rawValue' is the value as represented in the model
// ValueType is an enum of Digital, Analog or Serial

return (valueType != ValueType.Digital)
    ? rawValue
    : (rawValue == 0)
        ? "False"
        : "True";

然后我们需要反向ConvertBack方法。

我们遇到的问题是将valueType传递给转换器,以便在ConvertConvertBack方法中使用。您无法使用Parameter,因为您无法在Parameter上设置绑定。同样地,你不能简单地使用MultiValueConverter,因为ConvertBack没有交给那个值,而是希望你返回它。

那么如何将ValueType传递给转换器的Convert和ConvertBack方法呢?

我倾向于在转换器上暴露一个新属性并绑定到该属性,但我不确定在解析转换器时是否只评估该绑定一次。

2 个答案:

答案 0 :(得分:2)

我认为只使用转换器就可以实现这一目标,但您应该能够使用DataTemplate功能来实现几乎相同的结果。

  1. 使用DataGridTemplateColumn
  2. 为每个DataTemplate定义单独的ValueType。每个模板都有自己的值转换器,只需要处理一个ValueType的值,这样就不需要将ValueType传递给Convert方法。
  3. 使用自定义DataTemplateSelector根据值的类型选择合适的模板。

答案 1 :(得分:0)

我会创建一个表示自定义值的新对象。

public class MyCustomValue
{
    public ValueType Type { get; set; }
    public object RawValue { get; set; }
} 

在DataGrid的DataContext上:

public class MyObjectBoundToDataGrid
{
    public MyCustomValue Value { get; set;}   
}

您现在可以轻松转换您的价值。