2017-04-04 10 views
8

WPF में एक ValueTuple क्षेत्र के लिए बाध्य करने के लिए अगर मैं एक viewmodel संपत्तियह संभव के साथ सी # 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

आप अभी भी रैपर प्रॉपर्टी जैसे 'पब्लिक स्ट्रिंग एमडीएफ {get {return machineDefinition.Mdf;}}' बना सकते हैं। यह सबसे अच्छा नहीं है (यहां तक ​​कि एक अच्छा भी नहीं) लेकिन अभी भी काम करना चाहिए :) –

उत्तर

6

भ्रम है कि पुरानी शैली टपल (पूर्व सी 7 #) के लिए सभी आइटम गुण

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

और इस तरह bindable थे। ValueTuple के लिए वे खेतों

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

और नहीं bindable हैं।

यदि आप "WPF ट्यूपल बाइंडिंग" पर Google को झूठी सकारात्मक प्रतिक्रियाएं मिलती हैं क्योंकि पुराने स्टाइल टुपल्स बाध्यकारी हैं लेकिन नए नहीं हैं।

+1

ऐसा लगता है कि मूल्य टुपल्स कई अच्छी प्रथाओं का उल्लंघन करते हैं: वे सार्वजनिक क्षेत्रों का पर्दाफाश करते हैं और इसका मतलब है कि उनके उत्परिवर्तनीय structs हैं, जिन्हें मैंने हमेशा सोचा था कि एक बड़ा नंबर नहीं है। शायद परफॉर्मेंस विचार इस वजन को अधिक वजन देते हैं। – Evk

0

MdfPath दृष्टिकोण कभी काम नहीं करेगा, क्योंकि नाम भाग बहुत वास्तव में मौजूद है, इस संदर्भ में प्रतिबंधित है। अनिवार्य रूप से, यह शुद्ध कंपाइलर वूडू है, और टाइप मॉडल में मौजूद नहीं है, जिसका अर्थ यह है कि टाइप मॉडल (जिसमें प्रतिबिंब, यूआई टूल्स, सीरियलाइजर्स इत्यादि शामिल हैं) से संबंधित कुछ भी केवलItem1, Item2 नाम देखेंगे ; नकली नाम नहीं।

+0

आप मेरे प्रश्न में देखेंगे कि मैंने दोनों की कोशिश की। असली समस्या यह है कि ValueTuple फ़ील्ड का उपयोग करता है जबकि टुपल गुणों का उपयोग करता है। पूर्व अविभाज्य है और बाद में बाध्यकारी है। – 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}" /> 

उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे