WPF 将命令绑定到 Datagrid 中的 Datacontext
WPF binding command to Datacontext inside Datagrid
我刚刚开始使用 WPF 和 MVVM,并设法将我的 Datagrid 绑定到我的 DataContext ViewModel ProductList 列表 Class。但是,我现在正在尝试 将我的 DataGrid 中的按钮 绑定到我的 DataContext Class.
的某些命令
<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 正在更新,我可以在调试器中看到它。只有 UI 没有更新。
编辑 2: 现在工作正常!刚刚将这一行添加到我的 ProductsList setter:
set
{
SetProperty(ref _products, value);
}
您好,您可以按照以下方式操作:
{Binding DataContext.PreviousPageCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}
但是绑定只会在 DataGrid.DataContext 发生变化时更新,而不会在 DataContext.PreviousPageCommand 发生变化时更新。
如我的评论所述,您需要绑定到 (ViewModel) Parent/Ancestor.DataContext
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.PreviousPageCommand}"
您还需要绑定 DataGrid
的 SelectedItem
以便 ViewModel 在用户单击时知道按钮在哪一行。或者把按钮的DataContext
绑定到CommandParameter
。喜欢评论中提到的@Andy
我刚刚开始使用 WPF 和 MVVM,并设法将我的 Datagrid 绑定到我的 DataContext ViewModel ProductList 列表 Class。但是,我现在正在尝试 将我的 DataGrid 中的按钮 绑定到我的 DataContext Class.
的某些命令<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 正在更新,我可以在调试器中看到它。只有 UI 没有更新。
编辑 2: 现在工作正常!刚刚将这一行添加到我的 ProductsList setter:
set
{
SetProperty(ref _products, value);
}
您好,您可以按照以下方式操作:
{Binding DataContext.PreviousPageCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}
但是绑定只会在 DataGrid.DataContext 发生变化时更新,而不会在 DataContext.PreviousPageCommand 发生变化时更新。
如我的评论所述,您需要绑定到 (ViewModel) Parent/Ancestor.DataContext
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.PreviousPageCommand}"
您还需要绑定 DataGrid
的 SelectedItem
以便 ViewModel 在用户单击时知道按钮在哪一行。或者把按钮的DataContext
绑定到CommandParameter
。喜欢评论中提到的@Andy