2012-12-20 31 views
6

में दो कॉलम के साथ मैंने देखा है, कुछ चीजें पाई हैं और अब ड्रॉप-डाउन एरिया में प्रदर्शित दो कॉलम के साथ एक कंबोबॉक्स पर फंस गई हैं। मेरे पास एक एक्सएमएल थीम उपलब्ध है और कंबोबॉक्स "स्टाइल" परिभाषित किया गया है और उम्मीद के अनुसार अच्छी तरह से काम करता है, ताकि हिस्सा ठीक है।डब्ल्यूपीएफ स्टाइल कम्बोबॉक्स ड्रॉपडाउन

अब, मेरे पास एक combobox है कि मुझे दो मान प्रदर्शित करने की आवश्यकता है, इसे डेटाटेबल से आने वाले ड्रॉप-डाउन के लिए राज्य संक्षेप और राज्य नाम के रूप में सोचें। आइटम के लिए डीफॉल्ट व्यू बाध्यकारी स्रोत।

अगर मैं

<my:cboStates TextSearch.TextPath="StateAbbrev"> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" TextSearch.Text="{Binding Path=StateAbbrev}"> 
     <TextBlock Text="{Binding Path=StateAbbrev}"/> 
     <TextBlock Text="{Binding Path=FullStateName}" Margin="10 0"/> 
     </StackPanel> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
</my:cboStates> 

इस काम करता है। अब, मैं कैसे/कहाँ अटक गया हूं ... अब, मैं वही कार्यक्षमता 5 अलग-अलग रूपों और सभी को समान सामग्री प्रदर्शित करने के लिए चाहता हूं, और यदि कभी भी बदल जाता है (यह नहीं, लेकिन अन्य बहु-स्तंभ comboboxes के लिए), मैं इसे सीधे फॉर्म की एक्सएएमएल फ़ाइल में रखना नहीं चाहता हूं।

मैं थीम की संसाधन शब्दकोश फ़ाइल में शामिल होने की उम्मीद कर रहा था और बस उस "शैली" को फिर से उपयोग करना जारी रखता हूं। समझ में आता है। हालांकि, जब मैं करता हूँ, और बाध्यकारी डेटा तालिका में है, केवल परिणाम मैं जब के रूप में एक शैली लटकती है करने का प्रयास कर पाने

System.Data.DataRowView 
System.Data.DataRowView 
System.Data.DataRowView 
System.Data.DataRowView 
वास्तविक 2 कॉलम के बजाय

के मूल्यों को दर्शाता है। यहां "थीम" संसाधन शब्दकोश में मेरे पास है।

<DataTemplate x:Key="myStateComboTemplate" > 
    <StackPanel Orientation="Horizontal" > 
    <TextBlock Text="{Binding Path=StateAbbrev}"/> 
    <TextBlock Text="{Binding Path=FullStateName}"/> 
    </StackPanel> 
</DataTemplate> 

<Style x:Key="StyleMyStatesCombobox" TargetType="{x:Type ComboBox}" 
    BasedOn="{StaticResource MyOtherWorkingComboBoxStyle}" > 
    <Setter Property="TextSearch.TextPath" Value="{Binding Path=StateAbbrev}" /> 
    <Setter Property="ItemTemplate" Value="{StaticResource myStateComboTemplate}" /> 
</Style> 

तो, अगर मैं दो उदाहरणों मेरी "cboStates" वर्ग फार्म पर बनाया है, और स्पष्ट स्टाइल पहले सूचीबद्ध करने के लिए एक, और दूसरा "स्टाइल" सेटिंग के आधार पर निर्धारित किया है, दूसरा एक से विफल रहता है केवल दोहराया गया सिस्टम दिखा रहा है। डेटा.डेटाव्यूव्यू प्रविष्टियां, वास्तविक डेटा सामग्री नहीं।

मुझे क्या याद आ रही है।

तो, स्पष्ट करने के लिए मैं के लिए ... स्टेट्स क्या देख रहा हूँ ... पूर्व डेटा

AL Alabama 
AK Alaska 
AZ Arizona 
AR Arkansas 
CA California 
CO Colorado 
CT Connecticut 
DE Delaware 

मैं चाहता हूँ बता गया संक्षिप्त AL, एके, AZ, आदि और संकरा प्रदर्शित होने के लिए सम्मिश्रण पटी। यह बदले में "चयनित वैल्यू" भी होगा।

वास्तविक ड्रॉपडाउन ऊपर सूचीबद्ध सूचीबद्ध डेटा को संक्षेप में दिखाएगा और संक्षेप में राज्य का लंबा विवरण दिखाएगा।

वांछित बता गया

enter image description here

+0

कोई कारण नहीं है कि आप दोनों को एक साथ जोड़ नहीं सकते? मैं सोच रहा था कि आप हमेशा टुपल का उपयोग करने का प्रयास कर सकते हैं, लेकिन यह सुनिश्चित नहीं है कि यह कैसे काम करेगा। –

+0

@ बॉब, ट्यूपल माना जाता है, लेकिन यह एक सरल उदाहरण था जो कि एक combobox में पॉप्युलेट किया जाएगा कि कोई भी समझ सकता है। मैं वास्तव में विभिन्न प्रकार के समान comboboxes होगा कि डेटा टेबल से आ रहा होगा और अलग-अलग हो सकता है, इस प्रकार निश्चित मूल्य नहीं है। मैं डेटाबेस से पूछताछ नहीं करना चाहता था, फिर परिणाम combobox प्रस्तुति से आवश्यक के रूप में कुंजी/मूल्य/alt मूल्य/अतिरिक्त कुंजी, आदि फिर से पार्स करने के लिए बस एक और भंडारण टुपल में लूप और डाल दिया। – DRapp

+0

'शब्दकोश <स्ट्रिंग, स्ट्रिंग>' के बारे में क्या? 'टेक्स्ट' को 'टेक्स्ट' से 'कुंजी' और अन्य 'टेक्स्टब्लॉक' के लिए 'वैल्यू' बांधें? या दो पंक्तियों से अधिक संभव है? –

उत्तर

0

का नमूना अंत में यह काम कर रहा ... और इसी तरह के प्रयास करने से उन लोगों के लिए मिला है। चूंकि मैं एक मानक "वर्ग" उदाहरण रखने की कोशिश कर रहा था जिसका उपयोग पूरे समय किया जा सकता था, लेकिन प्रत्येक पृष्ठ में एक्सएएमएल को स्पष्ट रूप से संदर्भित नहीं करना चाहता था, स्टाइल का हिस्सा वास्तविक इन-कोड क्लास इंस्टेंस के दौरान संभाला जाना था।

चूंकि मुझे बिल्कुल पता नहीं है कि कैसे/कब .net फ्रेमवर्क अपने सभी नियंत्रण, स्टाइल एग्जिगमेंट इत्यादि बनाता है, मैं निराश हो रहा था कि यह xaml से सीधे अगर काम करेगा, लेकिन कोड में विफल हो जाएगा। इसलिए, मैं आइटम टेम्पलेट और टेक्स्टशर्च फॉरवर्ड करना चाहता हूं। कोड में टेक्स्टपाथ मान। यहां

public class myStatesCombo : ComboBox 
{ 
    public myStatesCombo() 
    { 
     Loaded += myAfterLoaded; 
    } 

    protected static DataTable myTableOfStates; 

    public void myAfterLoaded() 
    { 
     if(myTableOfStates == null) 
     myTableOfStates = new DataTable(); 

     CallProcedureToPopulateStates(myTableOfStates); 

     ItemsSource = myTableOfStates.DefaultView; 

     // AFTER the object is created, and all default styles attempted to be set, 
     // FORCE looking for the resource of the "DataTemplate" in the themes.xaml file 
     object tryFindObj = TryFindResource("myStateComboTemplate"); 
     if(tryFindObj is DataTemplate) 
     ItemTemplate = (DataTemplate)tryFindObj; 

     // NOW, the CRITICAL component missed in the source code 
     TextSearch.SetTextPath(this, "StateAbbrev"); 
    } 
} 

अब एक विशेष नोट का संक्षिप्त स्निपेट है।नियमित रूप से मैं डेटाटेबल को पॉप्युलेट करता था, मैं पूर्व-जांच करता हूं कि तालिका मौजूद है या नहीं। पहली बार, मैं टेबल बनाते हैं। अगर मुझे इसे फिर से पॉप्युलेट करने की ज़रूरत है, अगर मैं हर बार "नया डेटाटेबल" कर रहा हूं, तो यह डेटा/आइटम टेम्पलेट बाइंडिंग को उड़ा देता है। इससे बचने के लिए मैं तो

if(myTableOfStates.Rows.Count > 0) 
    myTableOfStates.Rows.Clear(); 

फिर, मैं) डेटाबेस (DataAdapter) से क्वेरी और datatable भरें (करने के लिए अपने

Sqlexecute कॉल कॉल करना होगा।

तो, अब सभी को सही ढंग से पॉप्युलेट किया गया है, डिस्प्ले और ग्रंथों के लिए बाइंडिंग पूर्ण और जाने के लिए तैयार हैं।