Сетка данных XAML с привязкой MultiSelect ComboBox - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть следующая 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 и смесью
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...