У меня есть следующая DataGrid:
<DataGrid DockPanel.Dock="Bottom" mah:DataGridHelper.EnableCellEditAssist="True" SelectedItem="{Binding SelectedEvent, Mode=TwoWay}" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding CurrItem.Events, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" VerticalScrollBarVisibility="Auto" AutoGenerateColumns="False" CanUserAddRows="True" AllowDrop="False" AutomationProperties.Name="Events" Margin="10,10,10,0" VerticalAlignment="Stretch">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="Description" Binding="{Binding Description, UpdateSourceTrigger=PropertyChanged}" Width="*"/>
<DataGridTextColumn Header="Date" Binding="{Binding Date, UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Header="AuxDate" Binding="{Binding AuxDate, UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Header="Location" Binding="{Binding Location, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTemplateColumn Header="Tags" Width="140">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}, Mode=OneWay, Path=DataContext.Tags}">
<ComboBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}" Unchecked="Tag_unchecked" Checked="Tag_checked" Tag="{Binding Id}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Желаемое поведение - иметь комбинированный список muti-select всех тегов для каждой строки в отдельности. У меня проблема с поиском способа привязать его к viewModel. Мое текущее решение - следующий уродливый обходной путь:
public Item CurrItem { get; set; }
private ArchivatorDbContext _context { get; set; }
public IList<Tag> Tags { get; }
public EventEntity SelectedEvent { get; set; }
public void AddTag(int TagId)
{
if (SelectedEvent == null) return;
_context.Add(new Event2Tag(){Tag = _context.Tags.Find(TagId), Event = SelectedEvent});
}
public void RemoveTag(int TagId)
{
if (SelectedEvent == null) return;
_context.Remove(SelectedEvent.Tags.First(tag => tag.TagId == TagId));
SelectedEvent.Tags.Remove(SelectedEvent.Tags.First(tag => tag.TagId == TagId));
}
Основная проблема с этим подходом состоит в том, что я использую ту же страницу для редактирования элементов, заменяя новый Item в viewModel на отредактированный, но из-за того, как это работает, теги не устанавливаются, так как они не связаны напрямую с элементами. Я также предпочел бы использовать dataBinding вместо кода, но я приму любое решение, которое работает.
По какой-то причине DataGridTemplateColumn не получает элемент из текущей строки, в отличие от DataGridTextColumn, что я делаю неправильно? И есть ли какая-нибудь библиотека, чтобы сделать это проще? Спасибо
Дополнительная информация:
- Приложение представляет собой приложение WPF со структурой сущностей
- Все зависимости являются последними стабильными выпусками
- Я использую Visual студия с ReSharper и смесью