c# - XAML DataGrid 与 MultiSelect ComboBox 绑定
问题描述
我有以下数据网格:
<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>
所需的行为是为每一行分别设置一个包含所有标签的多选组合框。我很难找到将其绑定到 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));
}
这种方法的主要问题是我使用相同的页面来编辑项目,通过将 viewModel 中的新项目交换为已编辑的项目,但是由于这种工作方式,标签不会被设置,因为它们没有直接绑定到项目。我也更喜欢使用 dataBinding 而不是代码,但我会采用任何可行的解决方案。
出于某种原因,DataGridTemplateColumn 没有从其当前行接收项目,与 DataGridTextColumn 不同,我做错了什么?有没有图书馆可以让这更容易?谢谢
额外信息:
- 该应用程序是具有实体框架的 WPF 应用程序
- 所有依赖项都是最新的稳定版本
- 我正在使用带有 ReSharper 和混合的 Visual Studio
解决方案
推荐阅读
- python - 如何在 Python 中计算方位角
- html - 使用 .ts 代码在 Init 上过滤 PrimeNG 表
- go - 错误未定义:imagick.Initialize 使用 imagick
- java - 将String返回方法转换为List
Java中的返回方法 - tensorflow - TfLite 模型与量化前模型的不同结果
- c - 这个数字代表什么
- javascript - addEventListener 在 div 中滚动
- python - asyncio python的并发和并行性
- c# - 使用Newtonsoft在c#中将字符串转换为逗号分隔数组
- javascript - 无法在 Node 中使用 ndjson 流,但类似的代码在 React 中有效