首页 > 解决方案 > 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 不同,我做错了什么?有没有图书馆可以让这更容易?谢谢

额外信息:

标签: c#wpfxamldatagrid

解决方案


推荐阅读