2013-08-27 5 views
11

के अंदर सक्रिय नहीं है, मैंने डेटाग्रिड के अंदर काम करते समय अपने कम्बोबॉक्स चयनित मूल्य को सहेजने के लिए संघर्ष किया है। जब मैं कोई डेटाग्रिड चीजों के साथ परीक्षण समाधान करता हूं तो ठीक काम कर रहे हैं। संदर्भ संबंधित देशों के साथ व्यक्ति नाम हैं। देशों को एक एक्सएमएल फ़ाइल में संग्रहीत किया जाता है।एमवीवीएम डब्ल्यूपीएफ कॉम्बोबॉक्स चयनित इटैम बाध्यकारी डाटाग्रिड

Combobox with country names

आप यहाँ PersonList.xaml (के महत्वपूर्ण भागों) देखें:: यहाँ प्रारंभिक दृश्य का एक स्नैपशॉट है

<UserControl.Resources> 
     <XmlDataProvider x:Key="Dataxml" Source="\Properties\AllCountries.xml" /> 
     <model:Person x:Key="Person"/> 
    </UserControl.Resources> 
    <UserControl.DataContext> 
     <viewModel:PersonListViewModel /> 
    </UserControl.DataContext> 

<DataGrid ItemsSource="{Binding Persons}" AutoGenerateColumns="False" IsReadOnly="False" CanUserAddRows="False" SelectionUnit="FullRow" SelectedItem="{Binding SelectedPerson}" > 
         <DataGrid.Columns> 
          <DataGridTextColumn Header="Name" Binding="{Binding Name}" CanUserSort="true" ></DataGridTextColumn> 
          <DataGridTemplateColumn Header="Country"> 
           <DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <ComboBox 
               Width="150" 
               SelectedValuePath="country" 
               IsSynchronizedWithCurrentItem="True" 
               ItemsSource="{Binding Source={StaticResource Dataxml}, XPath=/countries/country}" 
               SelectedIndex="{Binding CountryIndex}" 
               SelectedItem="{Binding Path=XmlCountry, Mode=TwoWay}"> 
              <ComboBox.ItemTemplate> 
               <DataTemplate> 
                <TextBlock> 
                 <TextBlock.Text> 
                  <MultiBinding StringFormat="{}{0}, {1}"> 
                   <Binding XPath="name" /> 
                   <Binding XPath="iso" /> 
                  </MultiBinding> 
                 </TextBlock.Text> 
                </TextBlock> 
               </DataTemplate> 
              </ComboBox.ItemTemplate> 
             </ComboBox> 
            </DataTemplate> 
           </DataGridTemplateColumn.CellTemplate> 
          </DataGridTemplateColumn> 
         </DataGrid.Columns> 
        </DataGrid> 

इस ग्रिड एक PersonListViewModel से पॉप्युलेट होता है एक है कि निजी ObservableCollection<Person> _persons विशेषता जो INotifyProperty लागू करती है और ग्रिड के लिए आइटम्ससोर्स है। आप ग्रिड में SelectedItem="{Binding SelectedPerson}" भी देखते हैं। वह हिस्सा ठीक काम करता है।

व्यक्ति मॉडल श्रेणी में देश इंडेक्स (स्ट्रिंग, एक्सएमएल-फाइल में गणना, गणना), देश (स्ट्रिंग, देश का नाम) है और अब मैंने XmlCountry विशेषता (XmlElement, xmlnode xml-file में लागू किया है। ।

?xml version="1.0" encoding="utf-8"?> 
<countries> 
    <country> 
    <iso>AF</iso> 
    <name>Afghanistan</name> 
    </country> 
    <country> 
    <iso>AL</iso> 
    <name>Albania</name> 
    </country> 
    <country> 
    <iso>DZ</iso> 
    <name>Algeria</name> 
    </country> 
    <country> 
    <iso>AS</iso> 
    <name>American Samoa</name> 
    </country> 
    <country> 
    <iso>AD</iso> 
    <name>Andorra</name> 
    </country> 
etc, etc, .... 

जब मैं ViewModel निर्माता व्यक्ति के देश के नाम देश सूचकांक कि प्रारंभिक मूल्यों को निर्धारित करने के रूप में आप स्क्रीन शॉट में देखने के लिए किया जाता है की गणना करने के लिए किया जाता है में लोगों को लोड मैं: xml फ़ाइल इस तरह दिखता है ऊपर दिए गए xaml में SelectedIndex="{Binding CountryIndex}" का उपयोग करके इसे प्राप्त किया।

और फिर समस्या शुरू हुई; मुझे टी नहीं मिल रहा वह Person मॉडल या PersonListViewModel पर कुछ भी कॉल करने के लिए combobox में देशों का चयन। मैं लगभग कुछ भी करने की कोशिश की है ...: पी

ऐसा नहीं है कि समाधान के लिए महत्वपूर्ण यह बता गया में बाध्यकारी है स्पष्ट है:

SelectedItem="{Binding Path=XmlCountry, Mode=TwoWay}" 

संपत्ति 'XmlCountry' यहाँ Person मॉडल में रहता है। मैंने इसे PersonListViewModel में भाग्य के साथ रखने की कोशिश की है। "सहेजें व्यक्ति" बटन ठीक काम करता है - यह "चयनित पर्सन" बाध्य संपत्ति लेता है और डेटाबेस को भेजता है। सिवाय इसके कि यह अद्यतन combobox मान नहीं मिलता है।

मैं SelectedItem/SelectedIndex को combobox में बाध्यकारी पर किसी भी मदद की सराहना करता हूं। और अन्य सुझाव भी: क्या मुझे Person मॉडल क्लास को लपेटने के लिए PersonViewModel की आवश्यकता है? क्या मुझे xml-file से PersonListViewModel पर "AllCountries" विशेषता बनाना चाहिए और xml-file के बजाय इसका उपयोग करना चाहिए?

बहुत पहले से धन्यवाद!

अद्यतन:

जैसा कि मैंने संदिग्ध: शैतान SelectedItem="{Binding Path=XmlCountry, Mode=TwoWay}" की स्थापना में किया गया था।

SelectedItem="{Binding XmlCountry, **UpdateSourceTrigger=PropertyChanged**}"

सब कुछ ठीक काम करता है:

जब मैं करने के लिए बदल दिया है। अब मैं अपने "सहेजें व्यक्ति" विधि के लिए सही डेटा पास कर रहा हूं। तथापि; यह पहली बार है जब मुझे सिंक में दृश्य और दृश्यमान रखने के लिए UpdateSourceTrigger सेट करना पड़ा था ....

उत्तर

10

बस ऊपर दिए गए प्रश्न से अद्यतन को पैरा-उद्धृत करना और इसे वास्तविक उत्तर में डालना।

शैतान चयनित Item = "{बाध्यकारी पथ = XmlCountry, मोड = दोवे}" सेटिंग में था।

जब मैं चयनित आइटम के लिए बाध्य बदलने के लिए:

SelectedItem="{Binding XmlCountry, **UpdateSourceTrigger=PropertyChanged**}" 

... सब कुछ ठीक काम करता है।

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