WPF

2011-03-16 12 views
8

में xaml से पीछे कोड में बाइंडिंग कॉन्स सदस्य कोडबेहिंड में किसी कॉन्स वैल्यू को किसी संपत्ति को बांधने का कोई अच्छा तरीका है?WPF

जब मैं ComboBox का उपयोग, मैं आमतौर पर इस तरह से XAML और कोड में पीछे कार्य करें:

XAML:

<ComboBox Name="cbBuz"> 
    <ComboBoxItem Content="foo" Uid="foo" IsSelected="true" /> 
    <ComboBoxItem Content="bar" Uid="bar" /> 
</ComboBox> 

codebehind:

ComboBoxItem item = cbBuz.GetSelectedItem(); 
switch (item.Uid) 
{ 
    case "foo": ... break; 
    case "bar": ... break; 
} 

कारण है कि मैं इस तरह से चुना है निम्नलिखित:

  • एल के लिए ocalization उद्देश्य, सामग्री स्ट्रिंग का उपयोग यह निर्धारित करने के लिए नहीं किया जाना चाहिए कि अंतिम चयनित आइटम को सहेजने और लोड करने के दौरान कौन सा आइटम चुना गया हो।
  • सादगी के लिए, एक्सएएमएल और कोड-बैक को आंतरिक पहचानकर्ता (इस मामले में, यूआईडी) से जोड़ा जाना चाहिए। इसलिए, एक्सएएमएल और कोड-बैक को अलग से रखा जा सकता है।

हालांकि, रखरखाव के लिहाज से, आंतरिक पहचानकर्ता एक जगह में इस तरह परिभाषित किया जाना चाहिए:

//IDs 
public const string ID_foo = "foo"; 
public const string ID_bar = "bar"; 

... 

// 
switch (item.Uid) 
{ 
    case ID_foo: ... break; 
    case ID_bar: ... break; 
} 

समस्या है प्रतीत होता है संपत्ति स्थिरांक मूल्य नहीं हो सकता, इसलिए वहाँ ID_foo बाध्य करने के लिए कोई रास्ता नहीं है और इस तरह ComboBoxItem का UID को ID_bar:

//If ID_foo and ID_bar are properties, this will work. 
<ComboBox Name="cbBuz"> 
    <ComboBoxItem Content="foo" Uid="{Binding ID_foo}" IsSelected="true" /> 
    <ComboBoxItem Content="bar" Uid="{Binding ID_bar}" /> 
</ComboBox> 

तो, मैं इस समस्या को हल करने के लिए कैसे जानना चाहते हैं। या, इसे लागू करने का कोई बेहतर तरीका है। यह भी अच्छा होगा। एक बार जब यह एक संपत्ति में है, यह बाध्यकारी के माध्यम से प्रयोग करने योग्य हो जाएगा

private const string ID_Foo = "foo"; 
public string FooId 
{ 
    get { return ID_Foo; } 
} 

:

बेस्ट,

उत्तर

18

आप बंद बेहतर होगा StaticExtension का उपयोग कर, इसलिए जैसे:

Uid="{x:Static local:YourClass.ID_foo}" 

कहाँ स्थानीय अपने वर्ग के सी # नाम स्थान के लिए एक xmlns उर्फ ​​है। अधिक जानकारी here मिल सकती है।

बाइंडिंग का उपयोग करने में समस्या यह है कि आप किसी ऐसे चीज़ के लिए बहुत अधिक ओवरहेड जोड़ रहे हैं जो कभी नहीं बदलेगा। बाध्यकारी आपकी संपत्ति की निगरानी करने का प्रयास करेगा। इसके अलावा, known "leaks" एक ऐसी ऑब्जेक्ट पर एक गैर-निर्भरता संपत्ति के साथ बाइंडिंग का उपयोग करने के साथ है जो INotifyPropertyChanged को लागू नहीं करता है।

+0

बहुत बहुत धन्यवाद! जैसा मुझे चाहिए था यह बिल्कुल वैसा ही है!इसके अलावा, रिसाव और ओवरहेड से संबंधित जानकारी वास्तव में उपयोगी है। – Aki24x

2

आप एक संपत्ति है कि निरंतर रिटर्न (एक स्थिरांक में परिभाषित), यानी बनाने की जरूरत है।

+0

ओह, यह सही है। क्या यह छोटा करने का कोई तरीका है? मेरा मतलब है कि यह सी ++ है, हम मैक्रो बनाने के लिए # परिभाषित कर सकते हैं, लेकिन हम नहीं कर सकते हैं। मैं सोच रहा हूं कि IValueConverter और Enum कॉम्बोबॉक्स में नया यूआईडी जोड़ते समय यह छोटा कर सकता है, पूरे कोड की मात्रा के संदर्भ में नहीं। – Aki24x

+1

@ Aki24x: आप संभावित रूप से एक IValueConverter के माध्यम से ऐसा कर सकते हैं और XAML में एक स्थिर (बाध्यकारी के माध्यम से नहीं) के रूप में एक मान निर्दिष्ट कर सकते हैं। इससे किसी भी IValueConverter को किसी भी तरह से लुकअप करने की इजाजत मिलती है, लेकिन आपको इसे देखने के लिए कुछ चाहिए, यानी: शब्दकोश में एक नाम, या एनम का उपयोग करें, या ... –

+0

मैं देखता हूं। धन्यवाद, रीड। =) – Aki24x

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

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