Как привязать данные из DataGridColumn к DataGridColumnHeader - PullRequest
0 голосов
/ 19 апреля 2019

В WPF я пытаюсь создать пользовательский элемент управления.

Этот элемент управления является производным от DataGrid.

В каждом заголовке столбца должен быть раскрывающийся список с уникальными значениями из соответствующего столбца.

В конце концов я хочу создать предикаты на основе выбранных элементов в раскрывающихся списках и отфильтровать результаты, отображаемые в таблице.

Вот файл Generic.xaml:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:customControls="clr-namespace:WpfCustomControlLibrary2">

    <Style TargetType="{x:Type customControls:FilterDataGrid}"
           BasedOn="{StaticResource {x:Type DataGrid}}">
        <Style.Resources>
            <Style TargetType="{ x:Type DataGridColumnHeader}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <StackPanel Orientation="horizontal">
                                <TextBlock Text="{Binding}"/>
                                <ComboBox ItemsSource="{Binding}" MaxWidth="600" MinWidth="200" >
                                    <ComboBox.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <CheckBox Selector.IsSelected="True" 
                                                    IsChecked="{Binding RelativeSource={RelativeSource Self},Path=(Selector.IsSelected), Mode=TwoWay}"/>
                                                <TextBlock Text="{Binding Element}"/>
                                            </StackPanel>
                                        </DataTemplate>
                                    </ComboBox.ItemTemplate>
                                </ComboBox>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="Height" Value="30"/>
                <Setter Property="Background" Value="Black"/>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="ToolTip" Value="Click to sort."/>
                    </Trigger>
                </Style.Triggers>

            </Style>
        </Style.Resources>
    </Style>
</ResourceDictionary>

Код для самого элемента управления:

    using System;
    using System.Windows.Controls;
    using System.Windows;
    using System.ComponentModel;
    using System.Windows.Data;

namespace WpfCustomControlLibrary2
{
    public class FilterDataGrid : DataGrid
    {
        private ICollectionView Datalist { get; set; }
        public bool IsFilter { get; set; }

        public FilterDataGrid()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterDataGrid), new FrameworkPropertyMetadata(typeof(FilterDataGrid)));
        }
        protected override void OnItemsSourceChanged(System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue)
        {
            Datalist = CollectionViewSource.GetDefaultView(newValue);
            //Datalist.Filter = Predicate
            base.OnItemsSourceChanged(oldValue, Datalist);
            if (IsFilter)
                FilterColumnPredicates();
            UpdateSource();
        }
        private void UpdateSource()
        {
            throw new NotImplementedException();
        }

        private void FilterColumnPredicates()
        {
            throw new NotImplementedException();
        }
    }
}

Для удобства использования вот файл MainWindow.xaml.cs:

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            List<TestData> cs = new List<TestData>
            {
                new TestData("!", "@"),
                new TestData("1", "2"),
                new TestData("a", "s"),
                new TestData("d", "f"),
                new TestData("z", "x"),
                new TestData("c", "v")
            };
            this.Bob.IsFilter = true;
           var a = cs.Select(s => new { Value = s.SomeThing }.ToString()).ToList();
            ObservableCollection<string> ib = new ObservableCollection<string>(a);

            this.Bob.ItemsSource = cs.Select(s => new { s.SomeThing, s.SomeValue });
            this.Bob.ItemsSource = cs.Select(s => new { s.SomeThing, s.SomeValue });
        }
    }
    public class TestData
    {
        public string SomeValue;
        public string SomeThing;
        public TestData(string val1, string val2)
        {
            SomeValue = val1;
            SomeThing = val2;
        }
    }
}

Теперь я не могу напрямую связываться со столбцами (представленным контентом) (потому что тогда я никогда не смогу снова отобразить значения, которые я удалил из фильтра).
Есть ли способ связать значения в соответствующем столбце источника данных DataGrid?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...