是否可以使用 C#7 绑定到 WPF 中的 ValueTuple 字段
Is it possible to bind to a ValueTuple field in WPF with C#7
如果我有视图模型属性
public (string Mdf, string MdfPath) MachineDefinition { get; set; }
我尝试在 XAML / WPF
中绑定它
<Label Content="{Binding Path=MachineDefinition.Item2}" />
或
<Label Content="{Binding Path=MachineDefinition.MdfPath}" />
我得到同样的错误
我看到 ValueTuple 字段实际上是 fields 而不是 properties。是这个问题吗?
MdfPath
方法永远行不通,因为名称部分在实际存在的位置上非常 受限。本质上,它是纯粹的编译器巫术,并且不存在于类型模型中,这意味着任何与类型模型(包括反射、UI 工具、序列化程序等)对话的东西都会 仅 看到Item1
、Item2
个名字;不是假名。
令人困惑的是,对于旧式元组(C#7 之前的版本),所有项目都是属性
https://msdn.microsoft.com/en-us/library/dd386940(v=vs.110).aspx
因此可绑定。对于 ValueTuple,它们是字段
并且不可绑定。
如果你 google "WPF Tuple Binding" 你会得到大量误报,因为旧式元组是可绑定的,但新式元组不是。
您可以尝试实现一个值转换器。
这是一个例子...
public class TupleDisplayNameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var tuple = value as (Int32 Id, String Name)?;
if (tuple == null)
return null;
return tuple.Value.Name;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
<TextBlock Text="{Binding Converter={StaticResource TupleDisplayNameConverter}, Mode=OneWay}" />
希望对您有所帮助。
如果我有视图模型属性
public (string Mdf, string MdfPath) MachineDefinition { get; set; }
我尝试在 XAML / WPF
中绑定它<Label Content="{Binding Path=MachineDefinition.Item2}" />
或
<Label Content="{Binding Path=MachineDefinition.MdfPath}" />
我得到同样的错误
我看到 ValueTuple 字段实际上是 fields 而不是 properties。是这个问题吗?
MdfPath
方法永远行不通,因为名称部分在实际存在的位置上非常 受限。本质上,它是纯粹的编译器巫术,并且不存在于类型模型中,这意味着任何与类型模型(包括反射、UI 工具、序列化程序等)对话的东西都会 仅 看到Item1
、Item2
个名字;不是假名。
令人困惑的是,对于旧式元组(C#7 之前的版本),所有项目都是属性
https://msdn.microsoft.com/en-us/library/dd386940(v=vs.110).aspx
因此可绑定。对于 ValueTuple,它们是字段
并且不可绑定。
如果你 google "WPF Tuple Binding" 你会得到大量误报,因为旧式元组是可绑定的,但新式元组不是。
您可以尝试实现一个值转换器。 这是一个例子...
public class TupleDisplayNameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var tuple = value as (Int32 Id, String Name)?;
if (tuple == null)
return null;
return tuple.Value.Name;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
<TextBlock Text="{Binding Converter={StaticResource TupleDisplayNameConverter}, Mode=OneWay}" />
希望对您有所帮助。