2013-08-27 61 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**}" 

...一切工作正常。

相关问题