1

我们有一个独特的案例,我们需要在 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 上设置绑定。同样,您不能简单地使用 a MultiValueConverter,因为ConvertBack没有传递该值,而是希望您返回它。

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

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

4

2 回答 2

2

我认为仅使用转换器是不可能实现的,但是您应该能够使用DataTemplate功能来实现几乎相同的结果。

  1. 利用DataGridTemplateColumn
  2. DataTemplate为每个单独定义ValueType. 每个模板都有自己的值转换器,它只需要处理一个 ValueType 的值,这样就无需将 ValueType 传递到Convert方法中。
  3. 使用自定义DataTemplateSelector根据值的类型选择合适的模板。
于 2015-11-09T03:28:49.323 回答
0

我将创建一个代表自定义值的新对象。

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

在 DataGrid 的 DataContext 上:

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

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

于 2015-11-09T05:13:09.387 回答