2017-04-04 96 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}" /> 

希望這有助於。

相關問題