22

如果我有一个 viewmodel 属性

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

我尝试在 XAML / WPF 中绑定它

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

或者

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

我犯了同样的错误

在此处输入图像描述

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

4

3 回答 3

39

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

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

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

https://github.com/dotnet/runtime/blob/5ee73c3452cae931d6be99e8f6b1cd47d22d69e8/src/libraries/System.Private.CoreLib/src/System/ValueTuple.cs#L269

并且不可绑定。

如果你用谷歌搜索“WPF 元组绑定”,你会得到大量误报,因为旧样式的元组是可绑定的,而新的元组不是。

于 2017-04-04T13:44:45.190 回答
10

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

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

希望这可以帮助。

于 2017-07-12T17:31:15.940 回答
3

这种MdfPath方法永远不会奏效,因为名称部分在实际存在的位置方面非常严格。本质上,它是纯编译器巫术,不存在于类型模型中,这意味着任何与类型模型(包括反射、UI 工具、序列化程序等)对话的东西都只会看到Item1,Item2名称;不是假名。

于 2017-04-04T13:41:21.103 回答