Попробовал реализовать свою задумку самостоятельно, но упёрся в тупик. Вот, что имею в проекте.
Использую DataGrid для отображения данных. Он в свою очередь находится внутри кастомного UserControl, в который также с помощью привязок поставляются поставляются коллекции данных типа ObservableCollection<string>.
Table.xaml
<UserControl>
<!--...-->
<DataGrid SelectionMode="Single" AutoGenerateColumns="False" CanUserReorderColumns="False" ColumnWidth="*" CanUserAddRows="False" CanUserDeleteRows="False" SelectionUnit="Cell">
<DataGrid.Columns>
<dgc:DataGridTextColumnWithCollection ColumnDataCollection="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}}, Path=Collection1}"/>
<dgc:DataGridTextColumnWithCollection ColumnDataCollection="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}}, Path=Collection2}"/>
...
</DataGrid.Columns>
</DataGrid>
<!--...-->
</UserControl>
Table.xaml.cs
public partial class Table : UserControl
{
//...
public static readonly DependencyProperty Collection1Property = DependencyProperty.Register(
"Collection1",
typeof(ObservableCollection<string>),
typeof(Table),
new FrameworkPropertyMetadata(null, null, null));
public ObservableCollection<string> Collection1
{
get { return (ObservableCollection<string>)GetValue(Collection1Property); }
set { SetValue(Collection1Property, value); }
}
public static readonly DependencyProperty Collection2Property = DependencyProperty.Register(
"Collection2",
typeof(ObservableCollection<string>),
typeof(Table),
new FrameworkPropertyMetadata(null, null, null));
public ObservableCollection<string> Collection2
{
get { return (ObservableCollection<string>)GetValue(Collection2Property); }
set { SetValue(Collection2Property, value); }
}
//...
}
В качестве колонок используется самописный наследник от DataGridTextColumn, которому добавлено свойство с коллекцией:
DataGridTextColumnWithCollection.cs
public class DataGridTextColumnWithCollection : DataGridTextColumn
{
public static readonly DependencyProperty ColumnDataCollectionProperty = DependencyProperty.Register(
"ColumnDataCollection",
typeof(ObservableCollection<string>),
typeof(DataGridTextColumnWithCollection),
new FrameworkPropertyMetadata(null, null, null));
public ObservableCollection<string> ColumnDataCollection
{
get { return (ObservableCollection<string>)GetValue(ColumnDataCollectionProperty); }
set { SetValue(ColumnDataCollectionProperty, value); }
}
}
И, наконец, в шаблоне DataGridCell к нему приписан Popup с ListBox, который является конечной точкой в цепи привязок
CustomDataGrid.xaml
<ResourceDictionary>
<!--...-->
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border>
<Grid>
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
<Popup Focusable="False" PopupAnimation="Slide">
<Grid x:Name="DropDown" SnapsToDevicePixels="True" Width="{TemplateBinding ActualWidth}">
<ListBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridCell}}, Path=Column.ColumnDataCollection}"/>
</Grid>
</Popup>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!--...-->
</ResourceDictionary>
Суть моей задачи - добиться того, чтобы в Popup-элементе у каждой DataGridCell отображался набор элементов, в зависимости от того, в каком столбце находится клетка. Эти элементы никак не зависят от Item-ов самого DataGrid-а и не являются ими или их частью.
Вышеописанная попытка с цепью привязок и кастомным свойством зависимости у столбца не сработала. Точно не понимаю, в каком месте происходит сбой, однако сильнее всего меня смущает эта привязка (CustomDataGrid.xaml):
<ListBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridCell}}, Path=Column.ColumnDataCollection}"/>
Поэтому, буду рад как определению ошибок в моём решении, так и предложенным альтернативам решению задачи с коллекциями у клеток в зависимости от колонок.
upd 1. Вот источник данных, к которым привяжутся свойства UserControl-a:
public class ViewModel : BaseViewModel
{
// ...
public ViewModel ()
{
Source1 = new ObservableCollection<string>();
Source2 = new ObservableCollection<string>();
Source1.Add("стол");
Source1.Add("шкаф");
Source2.Add("белый");
Source2.Add("красный");
}
public ObservableCollection<string> Source1 { get; set; }
public ObservableCollection<string> Source2 { get; set; }
// ...
}
И примерно такого результата хочу добиться:
