我们有一个独特的案例,我们需要在DataGrid列中显示自定义类型的值。自定义类型可以是以下三个值之一:数字,模拟和串行。
对于模拟或连续出版物,我们只想在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
传递给转换器,以便在Convert
和ConvertBack
方法中使用。您无法使用Parameter
,因为您无法在Parameter上设置绑定。同样地,你不能简单地使用MultiValueConverter
,因为ConvertBack
没有交给那个值,而是希望你返回它。
那么如何将ValueType传递给转换器的Convert和ConvertBack方法呢?
我倾向于在转换器上暴露一个新属性并绑定到该属性,但我不确定在解析转换器时是否只评估该绑定一次。
答案 0 :(得分:2)
我认为只使用转换器就可以实现这一目标,但您应该能够使用DataTemplate
功能来实现几乎相同的结果。
DataGridTemplateColumn
DataTemplate
定义单独的ValueType
。每个模板都有自己的值转换器,只需要处理一个ValueType的值,这样就不需要将ValueType传递给Convert
方法。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;}
}
您现在可以轻松转换您的价值。