В 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?