WPF MVVM数据绑定嵌套数据网格

WPF MVVM数据绑定嵌套数据网格,wpf,data-binding,Wpf,Data Binding,我是WPF和MVVM模式的初学者。在向后绑定的情况下,我仍然存在数据绑定问题。我想将组合框的selectedValues绑定到Oberservable集合中。我了解到可以将组合框的值绑定到属性,但在本例中,我希望绑定到集合的属性,并且集合是父集合 有人能解释一下如何将组合框selectedvalues绑定到我的observablecollection吗 我有一个解决办法,在我的viewmodel中为每个组合框创建一个新属性,收集所有值并按按钮将这些值存储到我的集合中,但这对我来说似乎是错误的,因

我是WPF和MVVM模式的初学者。在向后绑定的情况下,我仍然存在数据绑定问题。我想将组合框的selectedValues绑定到Oberservable集合中。我了解到可以将组合框的值绑定到属性,但在本例中,我希望绑定到集合的属性,并且集合是父集合

有人能解释一下如何将组合框selectedvalues绑定到我的observablecollection吗

我有一个解决办法,在我的viewmodel中为每个组合框创建一个新属性,收集所有值并按按钮将这些值存储到我的集合中,但这对我来说似乎是错误的,因为这不是数据绑定的行为

编辑组合框从每个模型中填充的项目已更正,但如何将组合框的selectedvalue绑定到集合属性

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, 
                                         AncestorType={x:Type Window}}, 
                                         Path=DataContext.Cities}" 
                                         DisplayMemberPath="Name"
                                         SelectedValue="{Binding Path=RowEntries }"/>
我有一个解决方案:

我的模型:

// INPC implemented by Propertychanged.Fody
    public class RowEntry : BaseModel
    {
        public string CityName { get; set; }
        public string CountryName { get; set; }
    }

    // INPC implemented by Propertychanged.Fody
    public class City : BaseModel
    {
        public string Name { get; set; }
    }
    // INPC implemented by Propertychanged.Fody
    public class Country : BaseModel
    {
        public string Name { get; set; }
    }
我的ViewModel:

public class TestViewModel : ViewModelBase
{
    #region properties
    // INPC implemented by Propertychanged.Fody
    public ObservableCollection<City> Cities { get; set; } = new ObservableCollection<City>();
    public ObservableCollection<Country> Countries { get; set; } = new ObservableCollection<Country>();
    public ObservableCollection<RowEntry> RowEntries { get; set; } = new ObservableCollection<RowEntry>();
    #endregion

    #region constructors and destructors

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public TestViewModel()
    {
        // Sample Data
        var temp = new City { Name = "Rom" };
        Cities.Add(temp);
        var temp2 = new City { Name = "Sydney" };
        Cities.Add(temp2);

        var temp3 = new Country { Name = "Italy" };
        Countries.Add(temp3);
        var temp4 = new Country { Name = "Australia" };
        Countries.Add(temp4);

        RowEntries.Add(new RowEntry());
    }
    #endregion
}
我的用户界面:

<StackPanel>
        <DataGrid ItemsSource="{Binding RowEntries}" AlternationCount="{Binding Items.Count, RelativeSource={RelativeSource Self}}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding AlternationIndex, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Header="#"/>
                <DataGridTemplateColumn Header="City">
                    <DataGridTemplateColumn.CellTemplate>
                        <HierarchicalDataTemplate>
                            <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, 
                                         AncestorType={x:Type Window}}, 
                                         Path=DataContext.Cities}" 
                                         DisplayMemberPath="Name"
                                         SelectedValue="{Binding Path=RowEntries }"/>
                        </HierarchicalDataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Countries">
                    <DataGridTemplateColumn.CellTemplate>
                        <HierarchicalDataTemplate>
                            <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, 
                                         AncestorType={x:Type Window}}, 
                                         Path=DataContext.Countries}" 
                                         DisplayMemberPath="Name"/>
                        </HierarchicalDataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button Content="Add Row" Margin="0,0,1797,0"></Button>
    </StackPanel>

您应该将组合框的SelectedValue属性绑定到RowEntry对象的CityName和CountryName属性,并将组合框的SelectedValuePath属性设置为Name。还将绑定的UpdateSourcePropertyTrigger设置为PropertyChanged:

<DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding AlternationIndex, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Header="#"/>
    <DataGridTemplateColumn Header="City">
        <DataGridTemplateColumn.CellTemplate>
            <HierarchicalDataTemplate>
                <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Cities}" 
                                         DisplayMemberPath="Name"
                                         SelectedValuePath="Name"
                                         SelectedValue="{Binding Path=CityName, UpdateSourceTrigger=PropertyChanged}"/>
            </HierarchicalDataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn Header="Countries">
        <DataGridTemplateColumn.CellTemplate>
            <HierarchicalDataTemplate>
                <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Countries}" 
                                         DisplayMemberPath="Name"
                                         SelectedValuePath="Name"
                                         SelectedValue="{Binding Path=CountryName, UpdateSourceTrigger=PropertyChanged}"/>
            </HierarchicalDataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

你的问题是什么?还显示XAML标记。很抱歉,在输入过程中断开了连接。请检查我的完整帖子您的RelativeSource似乎不正确,请尝试此RelativeSource={RelativeSource AncestorType={x:Type Window}}以避免误解。添加开始Rowentries集合为空,集合应由组合框中选定的值填充@我试过了,但这给我语法错误。非常感谢。我可以明天测试它,直到那时我有一个问题要问你的解决方案,以获得更好的理解。SelectedValuePath对我来说很有意义,但为什么我必须使用UpdateSourceTrigger=PropertyChanged才能使用呢?我认为事件已引发到后面的mvvm模式。UpdateSourceTrigger属性控制何时设置源属性:
<DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding AlternationIndex, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Header="#"/>
    <DataGridTemplateColumn Header="City">
        <DataGridTemplateColumn.CellTemplate>
            <HierarchicalDataTemplate>
                <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Cities}" 
                                         DisplayMemberPath="Name"
                                         SelectedValuePath="Name"
                                         SelectedValue="{Binding Path=CityName, UpdateSourceTrigger=PropertyChanged}"/>
            </HierarchicalDataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn Header="Countries">
        <DataGridTemplateColumn.CellTemplate>
            <HierarchicalDataTemplate>
                <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Countries}" 
                                         DisplayMemberPath="Name"
                                         SelectedValuePath="Name"
                                         SelectedValue="{Binding Path=CountryName, UpdateSourceTrigger=PropertyChanged}"/>
            </HierarchicalDataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>
public TestViewModel()
{
    ...
    RowEntries.Add(new RowEntry() { CityName = "Sydney", CountryName = "Australia" });
}