【问题标题】:MVVM WPF Datagrid TemplateColumn Combobox Selected Item Not WorkingMVVM WPF Datagrid TemplateColumn 组合框所选项目不起作用
【发布时间】:2016-07-04 06:04:29
【问题描述】:

我正在尝试使用带有 WPF 的 MVVM 模式将一些数据绑定到数据网格。我已经确认数据网格正在填充,并且确实填充了特定值(性别)。我还尝试了所有可以在网上找到的解决方法(包括本网站上的其他问题),这就是我在这里寻找答案的原因。

<DataGridTemplateColumn Header="Gender" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding Genders}"  SelectedItem="{Binding Gender, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True">
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我尝试过的事情:Mode=TwoWay、UpdateSourceTrigger=PropertyChanged"、IsSynchronizedWithCurrentItem="True"。虽然,我不是一个经验丰富的 WPF 和 MVVM 程序员,所以它可能很简单,我只是不知道关于。我的模型似乎在其他地方工作,它们实现了 observable/在适用的情况下位于 observable 集合中。

编辑:我把它整理好了。这是适用于我的问题的代码(以防其他人遇到类似问题)。

<DataGridTemplateColumn Header="Gender" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding Path=DataContext.Genders, RelativeSource={RelativeSource FindAncestor, AncestorType = Window}}" SelectedItem="{Binding Gender, UpdateSourceTrigger=PropertyChanged}">
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

【问题讨论】:

  • 您添加了 ComboBoxItem 元素但还尝试绑定 ItemsSource 属性似乎很奇怪。我会从您的 XAML 中删除 ComboBoxItem 条目,看看是否有帮助。
  • 啊,是的。那是个很好的观点。这是尝试了很多事情的结果。好像当我删除 ComboBoxItem 的 ComboBox 是空白的。我认为这可能是问题的征兆。
  • 检查 ItemsSource 是否正确绑定到您的 Genders 属性。它是否与 Gender 属性位于同一对象上?能不能在getter里面设置断点看是否被访问?
  • 另外,在调试项目时检查 Visual Studio 中的输出窗口。有时绑定错误会在那里打印警告,否则会静默失败。
  • 我在获取上设置了一个断点,但它似乎没有被访问。我的数据网格绑定到视图模型中患者的 Dependent 属性。 Genders 只是一个在视图模型中创建的简单字符串数组。

标签: c# wpf xaml mvvm datagrid


【解决方案1】:

假设您 DataGrid 的 DataContext 是 Patient 对象,请尝试使用 RelativeSource 绑定指向 DataGrid:

<DataGridTemplateColumn Header="Gender" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=DataContext.Genders}"
                      SelectedItem="{Binding Gender, UpdateSourceTrigger=PropertyChanged}"
                      IsSynchronizedWithCurrentItem="True">
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

【讨论】:

  • Patient 对象不存储 Genders(它存储与该 Patient 相关的 Gender)。性别位于 ViewModel 类中,它是我的视图的数据上下文。不过我不知道用相对路径访问它的方法。
  • 您的视图是否在同一个 XAML 文件中?您可以使用具有不同祖先类型(例如 UserControl)的 RelativeSource,或者您可以使用 ElementName 直接引用命名元素。
  • 是的。我只是不知道我的数据上下文是什么类型。下面是它的样子:DataContext="{Binding Source={StaticResource mainViewModelLocator}, Path=DependentsViewModel}"
  • RelativeSource 的 AncestorType 应该是您的视图,而不是 DataContext。 DataContext 将成为绑定路径的一部分(例如 DataContext.Genders)。
  • 好的,很酷。我很感激,但现在我的 SelectedItem 仍然没有绑定,当我为数据网格中的一个人选择一些东西时,它会填充到列中的每个组合框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多