MVVM WPF ComboBox SelectedItem 绑定未在数据网格内激活

Posted

技术标签:

【中文标题】MVVM WPF ComboBox SelectedItem 绑定未在数据网格内激活【英文标题】:MVVM WPF ComboBox SelectedItem Binding not activated inside datagrid 【发布时间】:2013-08-30 16:29:05 【问题描述】:

在数据网格中操作时,我一直在努力保存我的组合框选定值。当我制作没有数据网格的测试解决方案时,一切正常。上下文是与相关国家的人名。国家/地区存储在 xml 文件中。这是初始视图的快照:

您在此处看到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 填充,该模型具有实现 INotifyPropertyChanged 的​​私有 ObservableCollection&lt;Person&gt; _persons 属性,并且是网格的 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, ....

当我在 ViewModel 构造函数中加载人员时,人员的国家名称用于计算用于设置初始值的国家索引,如屏幕截图中所示。我通过在上面的 xaml 中使用 SelectedIndex="Binding CountryIndex" 实现了这一点。

然后问题就开始了;我无法在组合框中选择国家/地区来调用Person 模型或PersonListViewModel 上的任何内容。我几乎尝试过任何东西......:P

很明显,解决方案的关键是组合框中的这个绑定:

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

此处的属性“XmlCountry”位于Person 模型中。我试图把它放在PersonListViewModel 中,但没有成功。 “保存人员”按钮工作正常 - 它采用“SelectedPerson”绑定属性并发送到数据库。除了它没有得到更新的组合框值。

我希望对组合框中的 SelectedItem/SelectedIndex 绑定有任何帮助。还有其他建议:我是否需要PersonViewModel 来包装Person 模型类?我应该在我的PersonListViewModel 上从 xml 文件中创建一个“AllCountries”属性并直接使用它而不是 xml 文件吗?

更新:

正如我所怀疑的那样:魔鬼在SelectedItem="Binding Path=XmlCountry, Mode=TwoWay" 设置中。

当我改为:

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

一切正常。我现在将正确的数据传递给我的“保存人”方法。然而,这是我第一次不得不设置 UpdateSourceTrigger 以保持视图和视图模型同步......

【问题讨论】:

【参考方案1】:

只是引用上述问题的更新并将其放入实际答案中。

魔鬼在 SelectedItem="Binding Path=XmlCountry, Mode=TwoWay”设置。

当我将 Selected item 绑定更改为:

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

...一切正常。

【讨论】:

以上是关于MVVM WPF ComboBox SelectedItem 绑定未在数据网格内激活的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM 将 ComboBox 绑定到 Datagrid 选定项

MVVM WPF ComboBox SelectedValue 不是确切值

WPF MVVM ComboBox SelectedItem 或 SelectedValue 不起作用

WPF中ComboBox控件的SelectedItem和SelectedValue的MVVM绑定

WPF MVVM ComboBox(in DataGrid)触发事件SelectionChanged, 通知到ViewModel.

MVVM WPF ComboBox SelectedItem 绑定未在数据网格内激活