C# MVVM WPF Datagrid TemplateColumn组合框所选项目不工作

C# MVVM WPF Datagrid TemplateColumn组合框所选项目不工作,c#,wpf,xaml,mvvm,datagrid,C#,Wpf,Xaml,Mvvm,Datagrid,我正在尝试使用带有WPF的MVVM模式将一些数据绑定到datagrid。我已经确认datagrid正在填充,并且确实填充了特定值(性别)。我也尝试了我能在网上找到的每一个补丁(包括这个网站上的其他问题),这就是为什么我在这里寻找答案 <DataGridTemplateColumn Header="Gender" > <DataGridTemplateColumn.CellTemplate> <DataTemplate>

我正在尝试使用带有WPF的MVVM模式将一些数据绑定到datagrid。我已经确认datagrid正在填充,并且确实填充了特定值(性别)。我也尝试了我能在网上找到的每一个补丁(包括这个网站上的其他问题),这就是为什么我在这里寻找答案

<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程序员,所以这可能是一些我不知道的简单事情。我的模型似乎在其他地方工作,它们实现了可观测/在可观测集合中(如果适用)

编辑:我把它整理好了。下面是解决我的问题的代码(以防其他人有类似的问题)


假设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>

假设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>



您添加了ComboBoxItem元素,但还试图绑定ItemsSource属性,这似乎有些奇怪。我将从您的XAML中删除ComboBoxItem条目,看看这是否有帮助。啊,是的。这是一个很好的观点。这是尝试很多事情的结果。似乎当我删除ComboBoxItem的时,ComboBox是空白的。我想这可能是问题的征兆。请检查ItemsSource是否正确绑定到您的Genders属性。它是否与性别属性位于同一对象上?能否在getter内设置断点以查看是否已访问它?此外,在调试项目时,请检查Visual Studio中的“输出”窗口。有时绑定错误会在那里打印警告,但在其他情况下会以静默方式失败。我在获取上设置了一个断点,但它似乎没有被访问。我的datagrid绑定到视图模型中患者的从属属性。Genders只是在viewmodel中创建的一个简单字符串数组。添加ComboBoxItem元素并尝试绑定ItemsSource属性似乎有些奇怪。我将从您的XAML中删除ComboBoxItem条目,看看这是否有帮助。啊,是的。这是一个很好的观点。这是尝试很多事情的结果。似乎当我删除ComboBoxItem的时,ComboBox是空白的。我想这可能是问题的征兆。请检查ItemsSource是否正确绑定到您的Genders属性。它是否与性别属性位于同一对象上?能否在getter内设置断点以查看是否已访问它?此外,在调试项目时,请检查Visual Studio中的“输出”窗口。有时绑定错误会在那里打印警告,但在其他情况下会以静默方式失败。我在获取上设置了一个断点,但它似乎没有被访问。我的datagrid绑定到视图模型中患者的从属属性。Genders只是在viewmodel中创建的一个简单字符串数组。Patient对象不存储Genders(它存储与该患者相关的性别)。性别位于ViewModel类中,该类是my View的datacontext。我不知道如何使用相对路径访问它。您的视图在同一个XAML文件中吗?您可以将RelativeSource与其他祖先类型(例如UserControl)一起使用,也可以使用ElementName直接引用命名元素。是的,它是。我只是不知道我的datacontext是什么类型。下面是它的样子:DataContext=“{Binding Source={StaticResource mainViewModelLocator},Path=DependentsViewModel}”RelativeSource的AncestorType应该是您的视图,而不是DataContext。DataContext将是绑定路径的一部分(例如DataContext.Genders)。好的,很酷,这很管用。我很感激,但现在我的SelectedItem仍然没有绑定,当我在datagrid中为一个人选择某个内容时,它会填充到列中的每个组合框中。Patient对象不存储性别(它存储与该患者相关的性别)。性别位于ViewModel类中,该类是my View的datacontext。我不知道如何使用相对路径访问它。您的视图在同一个XAML文件中吗?您可以将RelativeSource与其他祖先类型(例如UserControl)一起使用,也可以使用ElementName直接引用命名元素。是的,它是。我只是不知道我的datacontext是什么类型。下面是它的样子:DataContext=“{Binding Source={StaticResource mainViewModelLocator},Path=DependentsViewModel}”RelativeSource的AncestorType应该是您的视图,而不是DataContext。DataContext将是绑定路径的一部分(例如DataContext.Genders)。好的,很酷,这很管用。我很感激,但现在我的SelectedItem仍然没有绑定,当我在datagrid中为一个人选择某个内容时,它会填充到列中的每个组合框中。