Команда Binding Button, которая внутри элемента ListView WPF MVVM - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть ListView, который выводит содержимое. всего 4 столбца: номер главы, заголовок, кнопка редактирования, кнопка удаления. При нажатии на кнопку необходимо получить элемент, в котором она находится (например, номер главы или название главы). Я пытался сделать привязку через имя ListView и через FindAncestor, но ничего не произошло. Пожалуйста, помогите решить проблему или укажите ошибки

XAML:

<ListView Name="TableOfContents" 
                              ItemsSource="{Binding Path=ContentList}" 
                              Background="{x:Null}" Width="600"
                              ScrollViewer.VerticalScrollBarVisibility="Auto"
                              ScrollViewer.HorizontalScrollBarVisibility="Auto"
                              ScrollViewer.CanContentScroll="True"                              
                              BorderBrush="{x:Null}">

                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="MouseDoubleClick">
                                <i:InvokeCommandAction 
                                    Command="{Binding Command}"
                                    CommandParameter="{Binding ElementName=TableOfContents, Path=SelectedItem}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>

                        <ListView.View>
                            <GridView>
                                <GridViewColumn Width="50">
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding ThemeID}" TextWrapping="Wrap"
                                                       Foreground="Black" FontSize="30"
                                                       TextAlignment="Center"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn Width="460">
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding ThemeName}" TextWrapping="Wrap"
                                                       Foreground="Black" FontSize="20"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn Width="40">
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button Content="?" ToolTip="Редактировать"
                                                       Foreground="Black" FontSize="18"
                                                    Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                                                                                      AncestorType={x:Type ItemsControl}},
                                                                      Path=TableOfContentsPageViewModel.EditTheme}"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn Width="40">
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button Content="❌" ToolTip="Удалить"
                                                    Foreground="Black" FontSize="18"
                                                    Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                                                                                      AncestorType={x:Type ItemsControl}},
                                                                      Path=TableOfContentsPageViewModel.DeleteTheme}"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>


                            </GridView>
                        </ListView.View>
                    </ListView>

ViewModel:

class TableOfContentsPageViewModel:BaseViewModel, IPageViewModel
    {
        public string SearchedChapter { get; set; }
        public Visibility CanEdit { get; set; } = Visibility.Hidden;
        public Theme SelectedTheme { get; set; }

        public ObservableCollection<Theme> ContentList { get; set; }

        public TableOfContentsPageViewModel()
        {
            ContentList = new ObservableCollection<Theme>(TrainSQL_Commands.GetAllThemes());
            CanEdit = CurrentUser.Role == "Administrator" ? Visibility.Visible : Visibility.Hidden;
        }

        private ICommand _editTheme;
        public ICommand EditTheme
        {
            get
            {
                return _editTheme ?? (_editTheme = new RelayCommand(x =>
                  {
                      MessageBox.Show("Edit theory");
                  }));
            }
        }

        private ICommand _deleteTheory;
        public ICommand DeleteTheme
        {
            get
            {
                return _deleteTheory ?? (_deleteTheory = new RelayCommand(x =>
                {
                    MessageBox.Show("Delete theory");
                }));
            }
        }
    }

Изображение: https://i.stack.imgur.com/cpROA.png

1 Ответ

0 голосов
/ 26 апреля 2020

Добро пожаловать в SO!

RelativeSource связывается с самим элементом управления, а не через DataContext (что имеет смысл, когда вы об этом думаете). В настоящее время вы привязываетесь к Пути TableOfContentsPageViewModel.DeleteTheme, вам нужно изменить его на DataContext.TableOfContentsPageViewModel.DeleteTheme.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...