Команда привязки WPF к Datacontext внутри Datagrid - PullRequest
1 голос
/ 18 апреля 2020

Я только начинаю работать с WPF и MVVM и мне удалось связать мой Datagrid со списком ProductList моего класса DataContext ViewModel. Однако сейчас я пытаюсь связать кнопки внутри моей DataGrid с некоторыми командами моего класса DataContext.

<DataGrid x:Name="myDataGrid" ItemsSource="{Binding ProductsList}" x:FieldModifier="public" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="No MAT" Binding="{Binding MATProductNumber}" Width="0.1*"/>
            <DataGridTextColumn Header="Format" Binding="{Binding tblFormat.FormatName}" Width="0.1*"/>
            <DataGridTextColumn Header="Nom produit" Binding="{Binding tblProduct.ProductName}" Width="0.1*"/>
            <DataGridTextColumn x:Name="productGradeHeader" Header="Grade" Binding="{Binding tblGrade.GradeName}" Width="0.1*"/>
            <DataGridTemplateColumn Width=".1*"           
                <DataGridTemplateColumn.HeaderTemplate> 
                     <DataTemplate>
                       <StackPanel Orientation="Horizontal">
                          <Button x:Name="leftArrowSearchButton" Command="{Binding PreviousPageCommand}" CommandParameter="1">
                            <materialDesign:PackIcon Kind="ArrowLeftThick" Width="25" Height="25" VerticalAlignment="Center"/>
                          </Button>
                          <Button x:Name="rightArrowSearchButton" Command="{Binding NextPageCommand}" CommandParameter="1">
                            <materialDesign:PackIcon Kind="ArrowRightThick" Width="25" Height="25" VerticalAlignment="Center"/>
                          </Button>
                       </StackPanel>
                     </DataTemplate>
               </DataGridTemplateColumn.HeaderTemplate>
           </DataGridTemplateColumn>
   </DataGrid.Columns>
</DataGrid>

Эта строка прямо здесь должна связываться с PreviousPageCommand в моем контексте данных

<Button x:Name="leftArrowSearchButton" Command="{Binding PreviousPageCommand}" CommandParameter="1"  ToolTip="Voir la page précédente" Height="24" Width="53" Margin="0,0,20,0">

Я отладил и обнаружил, что он даже не вызывает функцию. Поэтому я почти уверен, что проблема связана с привязкой.

Кажется, моя кнопка пытается выполнить привязку к элементу ProductsList. Есть ли способ вернуться на один уровень вверх? Я уже пытался привязать свои кнопки к DataContext.PreviousPageCommand

Заранее спасибо!

Редактировать 1: Вот код в бэкэнде в соответствии с запросом

 public ObservableCollection<tblMATProduct> ProductsList { get; set; }

 private void NextPageScrollCommand(string number)
 {
     Page++;
     navigate(Page, Size);
 }

 public void navigate(int page, int size)
 {
     var result = new ObservableCollection<tblMATProduct>(db.tblMATProduct.Include(s => s.tblGrade).Include(s => s.tblProduct).Include(s => s.tblFormat).OrderBy(s => s.MATProductID).Skip(page * size).Take(size).ToList());
     ProductsList = result;
 }

ProductsList is Обновление, я вижу это в отладчике. Не обновляется только пользовательский интерфейс.

Редактировать 2: Теперь все работает нормально! Просто добавил эту строку в мой список ProductsList:

set
        {
            SetProperty(ref _products, value);
        }

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Как указано в моем комментарии, вам необходимо привязать к (ViewModel) Parent/Ancestor.DataContext

Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.PreviousPageCommand}"

Вам также необходимо привязать SelectedItem вашего DataGrid, чтобы ViewModel знал, какая строка кнопка была, когда пользователь нажимает. Или связать DataContext кнопки с CommandParameter. как @ Andy , упомянутый в комментарии

1 голос
/ 18 апреля 2020

Здравствуйте, вы можете сделать следующее:

{Binding DataContext.PreviousPageCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}

Но привязка будет обновляться только при изменении DataGrid.DataContext, а не при изменении DataContext.PreviousPageCommand.

...