XAML 按钮命令未在CommunityToolKit DataGrid上执行

mqkwyuun  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(147)

我正在使用WinUI CommunityToolkit DataGridthis nuget包.下面是我数据网格定义:

  1. <toolkit:DataGrid x:Name="dataGrid"
  2. ItemsSource="{x:Bind ViewModel.Tests, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  3. MinHeight="500"
  4. AreRowDetailsFrozen="False"
  5. AreRowGroupHeadersFrozen="True"
  6. AutoGenerateColumns="False"
  7. CanUserSortColumns="True"
  8. ColumnHeaderHeight="40"
  9. FrozenColumnCount="0"
  10. RowDetailsVisibilityMode="Collapsed"
  11. RowGroupHeaderPropertyNameAlternative="Range">
  12. <toolkit:DataGrid.Columns>
  13. <toolkit:DataGridTemplateColumn Header="Records (count)" Tag="RecordsCount" Width="150">
  14. <toolkit:DataGridTemplateColumn.CellTemplate>
  15. <DataTemplate>
  16. <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding RecordsCount}"/>
  17. </DataTemplate>
  18. </toolkit:DataGridTemplateColumn.CellTemplate>
  19. </toolkit:DataGridTemplateColumn>
  20. <toolkit:DataGridTemplateColumn Width="184">
  21. <toolkit:DataGridTemplateColumn.CellTemplate>
  22. <DataTemplate>
  23. <StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
  24. <!-- Click event works but command doesn't getting executed -- >
  25. <Button Width="40" Height="40"
  26. Command="{Binding ViewModel.DeleteTestCommand, ElementName=testPage}"
  27. CommandParameter="{Binding Id}">
  28. </Button>
  29. <Button Width="40" Height="40"
  30. Command="{Binding ViewModel.EditTestCommand, ElementName=testPage}"
  31. CommandParameter="{Binding Id}">
  32. </Button>
  33. </StackPanel>
  34. </DataTemplate>
  35. </toolkit:DataGridTemplateColumn.CellTemplate>
  36. </toolkit:DataGridTemplateColumn>
  37. </toolkit:DataGrid.Columns>
  38. </toolkit:DataGrid>

下面是我视图模型:

  1. public partial class TestsPageViewModel : ObservableRecipient
  2. {
  3. public IRelayCommand<int> EditTestCommand { get; }
  4. public IRelayCommand<int> DeleteTestCommand { get; }
  5. public TestsPageViewModel(ITestsQueryService testsQueryService, INavigationService navigationService)
  6. {
  7. EditTestCommand = new RelayCommand<int>(EditTest);
  8. DeleteTestCommand = new RelayCommand<int>(DeleteTest);
  9. Tests = new ObservableCollection<TestModel>(); //(Some tests here);
  10. }
  11. public void DeleteTest(int id)
  12. {
  13. //var test = Tests.First(P => P.Id == id);
  14. }
  15. public void EditTest(int id)
  16. {
  17. //var test = Tests.First(P => P.Id == id);
  18. }
  19. public ObservableCollection<TestModel> Tests
  20. {
  21. get => _tests;
  22. set => SetProperty(ref _tests, value);
  23. }
  24. }

TestModel包含:

  • 公共整型ID { get;设置; }
  • public int findDuplicate {set; },...

正如我在Xaml中提到的,Click事件适用于按钮,但命令根本不起作用。
tnx任何帮助😊

guykilcj

guykilcj1#

我猜这是一个DataGrid的问题(或者通过设计?).
让我给你看两个解决方法。
A.使用Click事件:

TestPage.xaml.cs

  1. private void EditButton_Click(object sender, e)
  2. {
  3. if (sender is Button button &&
  4. button.DataContext is TestModel testModel)
  5. {
  6. this.ViewModel.EditTestModelCommand.Execute(testModel.Id);
  7. }
  8. }

B.在TestModel上添加EditCommandTestModel.cs

  1. public partial class TestModel : ObservableObject
  2. {
  3. [ObservableProperty]
  4. private id;
  5. public ICommand EditCommand { get; init; }
  6. }

TestViewModel.cs

  1. [RelayCommand]
  2. private void EditTestModel(int id)
  3. {
  4. }
  5. // Set the command on each models.
  6. TestModel model = new ()
  7. {
  8. Id = 1,
  9. EditCommand = EditTestModel,
  10. };
展开查看全部

相关问题