在 WPF C# 中根据数据网格中的另一个组合框过滤 DataGrid 中的组合框?

问题描述 投票:0回答:1

在我的示例中,我的数据网格中有 3 个组合框,分别显示国家、省份和地区。我如何按国家过滤省份,按省份过滤地区,以便当用户选择一个国家/地区时,他只获得该国家/地区的省份属于所选国家/地区,当他选择一个省份时,他仅获得属于该省份的地区,当他更改国家/地区时,省份和地区设置为空,当他更改省份时,地区设置为空:这里是MainWindwo.xaml:

<Window
    x:Class="DataGridBindingExample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:DataGridBindingExample"
    xmlns:materialdesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:DataGridBindingExample"
    Title="MainWindow"
    Width="800"
    Height="450"
    Topmost="True"
    mc:Ignorable="d">
    <Window.Resources>
        <vm:MainWindowViewModel x:Key="MainWindowViewModel" />
    </Window.Resources>

    <Grid>
        <Grid.Background>
            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                <GradientStop Offset="1" Color="#FF06013F" />
                <GradientStop Color="#FF040F2E" />
            </LinearGradientBrush>
        </Grid.Background>
        <StackPanel>
            <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding PlacesOfInterest}">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Country">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox
                                    Width="120"
                                    DisplayMemberPath="CountryName"
                                    ItemsSource="{Binding DataContext.Countries, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                    SelectedValue="{Binding CountryName}"
                                    SelectedValuePath="CountryName" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Province">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox
                                    Width="120"
                                    DisplayMemberPath="ProvinceName"
                                    ItemsSource="{Binding DataContext.Provinces, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                    SelectedValue="{Binding ProvinceID}"
                                    SelectedValuePath="ProvinceID" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="District">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox
                                    Width="120"
                                    DisplayMemberPath="DistrictName"
                                    ItemsSource="{Binding DataContext.Districts, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                    SelectedValue="{Binding DistrictID}"
                                    SelectedValuePath="DistrictID" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </

这是视图模型:

using CommunityToolkit.Mvvm.ComponentModel;
using DataGridBindingExample.Models;
using MaterialDesignFixedHintTextBox;
using System.Collections.ObjectModel;

namespace DataGridBindingExample
{
    public partial class MainWindowViewModel : ObservableObject
    {
        [ObservableProperty]
        ObservableCollection<PlacesOfInterest> placesOfInterest;
        [ObservableProperty]
        ObservableCollection<CountriesModel> countries;
        [ObservableProperty]
        ObservableCollection<ProvincesModel> provinces;
        [ObservableProperty]
        ObservableCollection<DistrictsModel> districts;


        public MainWindowViewModel()
        {
            this.PlacesOfInterest = new ObservableCollection<PlacesOfInterest>(DAL.LoadPlacesOfInterest());
            this.Countries = new ObservableCollection<CountriesModel>(DAL.LoadCountries());
            this.Provinces = new ObservableCollection<ProvincesModel>(DAL.LoadProvinces());
            this.Districts = new ObservableCollection<DistrictsModel>(DAL.LoadDistricts());
        }

    }
}

这是数据访问层:

using Dapper;
using DataGridBindingExample.Models;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

namespace MaterialDesignFixedHintTextBox
{
    public class DAL
    {
        private static readonly string ConnString = "Data Source=(local);Initial Catalog=CollegeDB;Integrated Security=True";

        //**************************************************************************************************

        public static List<PlacesOfInterest> LoadPlacesOfInterest()
        {
            using (IDbConnection conn = new SqlConnection(ConnString))
            {
                if (conn.State == ConnectionState.Closed) conn.Open();
                return conn.Query<PlacesOfInterest>("SELECT * FROM PlacesOfInterest").ToList();
            }
        }

        public static List<CountriesModel> LoadCountries()
        {
            using (IDbConnection conn = new SqlConnection(ConnString))
            {
                if (conn.State == ConnectionState.Closed) conn.Open();
                return conn.Query<CountriesModel>("SELECT * FROM Countries").ToList();
            }
        }

        public static List<ProvincesModel> LoadProvinces()
        {
            using (IDbConnection conn = new SqlConnection(ConnString))
            {
                if (conn.State == ConnectionState.Closed) conn.Open();
                return conn.Query<ProvincesModel>("SELECT * FROM Provinces").ToList();
            }
        }

        public static List<DistrictsModel> LoadDistricts()
        {
            using (IDbConnection conn = new SqlConnection(ConnString))
            {
                if (conn.State == ConnectionState.Closed) conn.Open();
                return conn.Query<DistrictsModel>("SELECT * FROM Districts").ToList();
            }
        }
    }
}

模特是:

   //CountriesModel
   public partial class CountriesModel : ObservableObject
   {
       [ObservableProperty]
       string countryName;
   }

   //ProvincesModel
   public partial class ProvincesModel : ObservableObject
   {
       [ObservableProperty]
       string countryName;

       [ObservableProperty]
       int provinceID;

       [ObservableProperty]
       string provinceName;
   }

   //DistrictsModel
   public partial class DistrictsModel : ObservableObject
   {
       [ObservableProperty]
       int provinceID;

       [ObservableProperty]
       int districtID;

       [ObservableProperty]
       string districtName;
   }

   //PlacesOfInterest
       public partial class PlacesOfInterest : ObservableObject
   {
       [ObservableProperty]
       int iD;

       [ObservableProperty]
       string countryName;

       [ObservableProperty]
       int provinceID;

       [ObservableProperty]
       int districtID;
   }

数据库:

USE [CollegeDB]
GO
/****** Object:  Table [dbo].[Countries]    Script Date: 1/7/2024 7:29:40 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Countries](
    [CountryName] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Countries] PRIMARY KEY CLUSTERED 
(
    [CountryName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Districts]    Script Date: 1/7/2024 7:29:40 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Districts](
    [ProvinceID] [int] NULL,
    [DistrictID] [int] IDENTITY(1,1) NOT NULL,
    [DistrictName] [nvarchar](50) NULL,
 CONSTRAINT [PK_Districts] PRIMARY KEY CLUSTERED 
(
    [DistrictID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[PlacesOfInterest]    Script Date: 1/7/2024 7:29:40 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[PlacesOfInterest](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [CountryName] [nvarchar](50) NULL,
    [ProvinceID] [int] NULL,
    [DistrictID] [int] NULL,
 CONSTRAINT [PK_PlacesOfInterest] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Provinces]    Script Date: 1/7/2024 7:29:40 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Provinces](
    [CountryName] [nvarchar](50) NULL,
    [ProvinceID] [int] IDENTITY(1,1) NOT NULL,
    [ProvinceName] [nvarchar](50) NULL,
 CONSTRAINT [PK_Provinces] PRIMARY KEY CLUSTERED 
(
    [ProvinceID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[Countries] ([CountryName]) VALUES (N'Country1')
GO
INSERT [dbo].[Countries] ([CountryName]) VALUES (N'Country2')
GO
INSERT [dbo].[Countries] ([CountryName]) VALUES (N'Country3')
GO
INSERT [dbo].[Countries] ([CountryName]) VALUES (N'Country4')
GO
INSERT [dbo].[Countries] ([CountryName]) VALUES (N'Country5')
GO
SET IDENTITY_INSERT [dbo].[Districts] ON 
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (1, 1, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (1, 2, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (2, 3, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (2, 4, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (3, 5, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (3, 6, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (4, 7, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (4, 8, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (5, 9, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (5, 10, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (6, 11, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (6, 12, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (7, 13, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (7, 14, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (8, 15, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (8, 16, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (9, 17, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (9, 18, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (10, 19, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (10, 20, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (11, 21, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (11, 22, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (12, 23, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (12, 24, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (13, 25, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (13, 26, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (14, 27, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (14, 28, N'District2')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (15, 29, N'District1')
GO
INSERT [dbo].[Districts] ([ProvinceID], [DistrictID], [DistrictName]) VALUES (15, 30, N'District2')
GO
SET IDENTITY_INSERT [dbo].[Districts] OFF
GO
SET IDENTITY_INSERT [dbo].[PlacesOfInterest] ON 
GO
INSERT [dbo].[PlacesOfInterest] ([ID], [CountryName], [ProvinceID], [DistrictID]) VALUES (1, N'Country1', 1, 1)
GO
SET IDENTITY_INSERT [dbo].[PlacesOfInterest] OFF
GO
SET IDENTITY_INSERT [dbo].[Provinces] ON 
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country1', 1, N'Province1')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country1', 2, N'Province2')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country1', 3, N'Province3')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country2', 4, N'Province1')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country2', 5, N'Province2')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country2', 6, N'Province3')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country3', 7, N'Province1')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country3', 8, N'Province2')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country3', 9, N'Province3')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country4', 10, N'Province1')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country4', 11, N'Province2')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country4', 12, N'Province3')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country5', 13, N'Province1')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country5', 14, N'Province2')
GO
INSERT [dbo].[Provinces] ([CountryName], [ProvinceID], [ProvinceName]) VALUES (N'Country5', 15, N'Province3')
GO
SET IDENTITY_INSERT [dbo].[Provinces] OFF
GO
ALTER TABLE [dbo].[Districts]  WITH CHECK ADD  CONSTRAINT [FK_Districts_Provinces] FOREIGN KEY([ProvinceID])
REFERENCES [dbo].[Provinces] ([ProvinceID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Districts] CHECK CONSTRAINT [FK_Districts_Provinces]
GO
ALTER TABLE [dbo].[PlacesOfInterest]  WITH CHECK ADD  CONSTRAINT [FK_PlacesOfInterest_Countries] FOREIGN KEY([CountryName])
REFERENCES [dbo].[Countries] ([CountryName])
GO
ALTER TABLE [dbo].[PlacesOfInterest] CHECK CONSTRAINT [FK_PlacesOfInterest_Countries]
GO
ALTER TABLE [dbo].[PlacesOfInterest]  WITH CHECK ADD  CONSTRAINT [FK_PlacesOfInterest_Districts] FOREIGN KEY([DistrictID])
REFERENCES [dbo].[Districts] ([DistrictID])
GO
ALTER TABLE [dbo].[PlacesOfInterest] CHECK CONSTRAINT [FK_PlacesOfInterest_Districts]
GO
ALTER TABLE [dbo].[PlacesOfInterest]  WITH CHECK ADD  CONSTRAINT [FK_PlacesOfInterest_Provinces] FOREIGN KEY([ProvinceID])
REFERENCES [dbo].[Provinces] ([ProvinceID])
GO
ALTER TABLE [dbo].[PlacesOfInterest] CHECK CONSTRAINT [FK_PlacesOfInterest_Provinces]
GO
ALTER TABLE [dbo].[Provinces]  WITH CHECK ADD  CONSTRAINT [FK_Provinces_Countries] FOREIGN KEY([CountryName])
REFERENCES [dbo].[Countries] ([CountryName])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Provinces] CHECK CONSTRAINT [FK_Provinces_Countries]
GO
c# wpf xaml datagrid datatemplate
1个回答
0
投票

你应该使用ListViews;并且不需要DataGrid;使用网格代替布局。 (ListView“面板模板”可以堆叠和/或包装项目)。

您可以通过 .SelectionChanged 和“级联”过滤和同步每个(列表)“视图”。

当选择“父级”(视图项)时,它会检索(并排序)其子级,加载其子级 ListView 的 .ItemsSource,并将 .SelectedIndex 设置为 0;它级联到“它的”子视图。

(如果您将“查询源”预加载到内存中,这一切都非常快)

如果 ToString() 重写返回一个名称,则一切就绪。否则,您的列表视图需要一个数据模板。我倾向于在适当的时候包含(标志)图像或(字体)图标(通过项目数据对象中的“功能”属性)。对图案本身没有影响。

© www.soinside.com 2019 - 2024. All rights reserved.