2013-08-27 88 views
11

當我在數據網格中操作時,我一直在努力保存我的組合框選定值。當我製作沒有數據網格的測試解決方案時,情況正常。上下文是關聯國家的人名。這些國家存儲在一個XML文件。這裏是初始視圖的快照:MVVM WPF組合框SelectedItem綁定未在數據網格內激活

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屬性,實現INotifyPropertyChanged並且是網格的ItemsSource。您還可以在網格中看到SelectedItem="{Binding SelectedPerson}"。那部分工作正常。

Person模型類具有CountryIndex(字符串,在xml文件中計算的索引,計算出的),Country(字符串,國家名稱),現在我實現了XmlCountry屬性(XmlElement,xml文件中的xmlnode。 XML文件是這樣的:

?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, .... 

當我加載視圖模型構造人的國家名稱是用於計算作爲你在截圖中看到設置初始值的國家指標的人我通過在上面的xaml中使用SelectedIndex="{Binding CountryIndex}"實現了這一點。

然後問題開始了;我無法獲得t他選擇組合框中的國家以調用任何關於Person模型或PersonListViewModel的模型。我已經試過幾乎所有的東西...:P

顯而易見的是,在關鍵的解決方案是這樣的結合在下拉列表:

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

屬性「XmlCountry」在這裏駐留在Person模型。我試圖把它放在PersonListViewModel沒有運氣。 「保存人員」按鈕正常工作 - 它將「SelectedPerson」綁定屬性併發送到數據庫。除了它沒有得到更新的組合框值。

我會對組合框中的SelectedItem/SelectedIndex綁定提供幫助。還有其他的建議:我需要一個PersonViewModel包裝Person模型類也許?我應該從xml文件在我的PersonListViewModel上創建「AllCountries」屬性,並直接使用它來代替xml文件嗎?

非常感謝!

UPDATE:

正如我懷疑:魔鬼是在SelectedItem="{Binding Path=XmlCountry, Mode=TwoWay}"設置。

當我更改爲:

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

一切工作正常。我現在將正確的數據傳遞給我的「保存人員」方法。然而;這是我第一次不得不設置UpdateSourceTrigger保持視圖和viewmodel同步....

回答

10

只是從上述問題中引用更新並將其放入實際答案中。

魔鬼在SelectedItem =「{Binding Path = XmlCountry, Mode = TwoWay}」設置。

當我改變所選擇的項目結合:

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

...一切工作正常。

相關問題