首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF Datagrid ComboBox选项根据另一个行值而不同

在 WPF 中,如果你希望 DataGrid 中的 ComboBox 选项根据同一行的另一个单元格的值而不同,可以通过绑定和数据模板来实现。以下是一个详细的示例,展示如何实现这一功能。

示例场景

假设你有一个 DataGrid,其中有两列:CategorySubCategorySubCategory 列中的 ComboBox 选项应根据 Category 列的值而变化。

步骤 1: 创建数据模型

首先,创建一个数据模型来表示每一行的数据。

代码语言:javascript
复制
public class Item
{
    public string Category { get; set; }
    public string SubCategory { get; set; }
}

步骤 2: 创建视图模型

创建一个视图模型来管理数据和选项。

代码语言:javascript
复制
public class ViewModel
{
    public ObservableCollection<Item> Items { get; set; }
    public Dictionary<string, List<string>> SubCategories { get; set; }

    public ViewModel()
    {
        Items = new ObservableCollection<Item>
        {
            new Item { Category = "Fruit", SubCategory = "Apple" },
            new Item { Category = "Vegetable", SubCategory = "Carrot" }
        };

        SubCategories = new Dictionary<string, List<string>>
        {
            { "Fruit", new List<string> { "Apple", "Banana", "Orange" } },
            { "Vegetable", new List<string> { "Carrot", "Broccoli", "Spinach" } }
        };
    }
}

步骤 3: 创建数据模板选择器

创建一个数据模板选择器,用于根据 Category 列的值选择不同的 ComboBox 选项。

代码语言:javascript
复制
public class SubCategoryTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var cell = container as FrameworkElement;
        if (cell != null && item != null)
        {
            var itemData = item as Item;
            if (itemData != null)
            {
                var window = Application.Current.MainWindow;
                var viewModel = window.DataContext as ViewModel;

                if (viewModel != null && viewModel.SubCategories.ContainsKey(itemData.Category))
                {
                    var subCategories = viewModel.SubCategories[itemData.Category];
                    var comboBoxTemplate = new DataTemplate();

                    var factory = new FrameworkElementFactory(typeof(ComboBox));
                    factory.SetValue(ComboBox.ItemsSourceProperty, subCategories);
                    factory.SetBinding(ComboBox.SelectedItemProperty, new Binding("SubCategory"));

                    comboBoxTemplate.VisualTree = factory;
                    return comboBoxTemplate;
                }
            }
        }
        return null;
    }
}

步骤 4: 定义 XAML

在 XAML 中定义 DataGrid 和绑定视图模型。

代码语言:javascript
复制
<Window x:Class="WpfApp.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:SubCategoryTemplateSelector x:Key="SubCategoryTemplateSelector" />
    </Window.Resources>
    <Grid>
        <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Category" Binding="{Binding Category}" />
                <DataGridTemplateColumn Header="SubCategory" CellTemplateSelector="{StaticResource SubCategoryTemplateSelector}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

步骤 5: 设置 DataContext

在代码隐藏文件中设置 DataContext。

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }
}

完整代码

MainWindow.xaml

代码语言:javascript
复制
<Window x:Class="WpfApp.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券