是否可以使用C#7绑定到WPF中的ValueTuple字段

时间:2017-04-04 13:36:22

标签: c# wpf xaml valuetuple

如果我有一个viewmodel属性

public (string Mdf, string MdfPath) MachineDefinition { get; set; }

我尝试在XAML / WPF中绑定它

<Label Content="{Binding Path=MachineDefinition.Item2}" />

<Label  Content="{Binding Path=MachineDefinition.MdfPath}" />

我得到了同样的错误

enter image description here

我发现ValueTuple字段实际上是字段而不是属性。这是问题吗?

3 个答案:

答案 0 :(得分:15)

令人困惑的是,对于旧式Tuple(前C#7),所有项目都是属性

https://msdn.microsoft.com/en-us/library/dd386940(v=vs.110).aspx

因此可绑定。对于ValueTuple,它们是字段

https://github.com/dotnet/corefx/blob/master/src/System.ValueTuple/src/System/ValueTuple/ValueTuple.cs#L291

并且不可绑定。

如果你谷歌“WPF Tuple Binding”你会得到大量的误报,因为旧式元组是可绑定的,但新的元组不是。

答案 1 :(得分:5)

你可以尝试的是实现一个值转换器。 这是一个例子......

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}" />

希望这有帮助。

答案 2 :(得分:1)

MdfPath方法永远不会有效,因为名称部分非常限制它实际存在的位置。本质上,它是纯粹的编译器voodoo,并且不存在于类型模型中,这意味着任何与类型模型(包括反射,UI工具,序列化器等)对话的内容都只会 查看Item1Item2名称;不是假名。