2017-04-04 102 views
8

如果我有一个视图模型属性是否可以绑定到ValueTuple场WPF与C#7

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字段是真的领域没有性能。这是问题吗?

+1

是的,这就是问题所在。 –

+0

不知道为什么,但Tuple具有属性字段,ValueTuple具有字段字段。这有点烦人:( – bradgonesurfing

+0

你仍然可以像'public string Mdf {get {return MachineDefinition.Mdf;}}一样制作包装属性,它不是最好的(甚至不是好的)方式,但仍然应该工作:) –

回答

6

这种混淆的是,对老式元组(预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元组绑定”你会得到大量的误报,因为旧式元组是可绑定的,但新的元组没有。

+1

看起来值元组违反了几个很好的实践:他们暴露公共领域,这意味着他们是可变结构,我一直认为这是一个主要的禁忌。可能的性能考虑超重这一点。 – Evk

0

MdfPath方法将永远不会工作,因为名称部分是非常有限实际上存在的位置。本质上,它是纯粹的编译器巫术,并且不存在于类型模型中,这意味着任何与类型模型(包括反射,UI工具,序列化器等)对话的将只有请参阅Item1,Item2名称;不是假名称。

+0

你会在我的问题中看到我尝试了两种。真正的问题是ValueTuple使用字段而Tuple使用属性。前者是不可取的,后者是可以绑定的。 – bradgonesurfing

3

你可以尝试的东西是实现一个值转换器。 下面是一个例子...

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

希望这有助于。

相关问题