Shift
Shift

Reputation: 642

WPF DataGrid with 2 DataGridComboBoxColumns update second combobox based on selection of first combobox

I have a Datagrid that is bound to a datasoruce. Also there are 2 DataGridComboBoxColumn's that are populated by a static List. The binding of the DataGridComboBoxColumn's are like:

<DataGridComboBoxColumn Header="Category" Width="150" SelectedValuePath="ID" SelectedValueBinding="{Binding Category, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="CategoryName" ItemsSource="{Binding ReturnCategories, Source={StaticResource Typeslist}}"/>

<DataGridComboBoxColumn Header="Sub Category" Width="150" SelectedValuePath="ID" SelectedValueBinding="{Binding SubCategory, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="CategoryName" ItemsSource="{Binding ReturnSubCategories, Source={StaticResource Typeslist}}"/>

When the datagrid is loaded the Main Category combobox is populated with the categories and also selected correctly based on the record set. The second combobox is populated also. What I want to achieve is whenever I change the main category combobox the sub category combobox needs to load corresponding values based on the selection of main categories. Currently the static resources of the main and sub categories doesn’t accept any parameters. Is it possible to pass a parameter to the sub category static resource so it could load the corresponding list.

The static resources are populated by the database on call from XAML.

static List<MainCategories> mainCatergoryBuffer = new List<MainCategories>();
static List<SubCategories> subCatergoryBuffer = new List<SubCategories>();

If I should change the subcategory content based on main category selection does this mean that the other rows values of the sub category will effected also?

How can I solve this issue?

Grid example: enter image description here

Upvotes: 1

Views: 1069

Answers (1)

aybe
aybe

Reputation: 16662

EDIT

You won't be easily able to do that, these combo boxes do not inherit the data grid data context.

http://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k(System.Windows.Controls.DataGridComboBoxColumn);k(VS.XamlEditor);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true

Binding in a WPF data grid text column

https://www.google.fr/search?q=Cannot+find+governing+FrameworkElement+or+FrameworkContentElement+for+target+element.&oq=Cannot+find+governing+FrameworkElement+or+FrameworkContentElement+for+target+element.&aqs=chrome..69i57j0l4.1185j0j7&sourceid=chrome&es_sm=122&ie=UTF-8

WPF Error: Cannot find governing FrameworkElement for target element

Advice : use the free data grid from Xceed, you won't run onto such issues

https://wpftoolkit.codeplex.com/


Here's a really simple example on how to achieve this,

Obivously you'll want to adapt to it to your current classes.

enter image description here enter image description here

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;

namespace WpfApplication5
{
    /// <summary>
    ///     Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            DataContext = new MyObject();
        }
    }

    internal class MyObject
    {
        public MyObject()
        {
            AvailableCategories = new ObservableCollection<Category>(new List<Category>(new[]
            {
                new Category
                {
                    Name = "category1",
                    SubCategories = new List<Category>(new[]
                    {
                        new Category {Name = "subCategory1a"},
                        new Category {Name = "subCategory1b"}
                    })
                },
                new Category
                {
                    Name = "category2",
                    SubCategories = new List<Category>(new[]
                    {
                        new Category {Name = "subCategory2a"},
                        new Category {Name = "subCategory2b"}
                    })
                }
            }));
        }

        public ObservableCollection<Category> AvailableCategories { get; private set; }
    }

    public class Category
    {
        public string Name { get; set; }

        public List<Category> SubCategories { get; set; }

        public override string ToString()
        {
            return String.Format("Name: {0}", Name);
        }
    }
}

And the XAML :

<Window x:Class="WpfApplication5.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"
        xmlns:wpfApplication5="clr-namespace:WpfApplication5"
        Title="MainWindow"
        Width="300"
        Height="300"
        Loaded="Window_Loaded"
        mc:Ignorable="d">
    <Grid>
        <Grid.Resources>
            <DataTemplate x:Key="DataTemplateCategory" DataType="wpfApplication5:Category">
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </Grid.Resources>
        <StackPanel>
            <ComboBox x:Name="ComboBox1"
                      ItemTemplate="{StaticResource DataTemplateCategory}"
                      ItemsSource="{Binding AvailableCategories}"
                      d:DataContext="{d:DesignData MyClass}" />
            <ComboBox DataContext="{Binding ElementName=ComboBox1,
                                            Path=SelectedItem}"
                      ItemTemplate="{StaticResource DataTemplateCategory}"
                      ItemsSource="{Binding Path=SubCategories}"
                      d:DataContext="{d:DesignData Category}" />
        </StackPanel>
    </Grid>
</Window>

Upvotes: 1

Related Questions