WPF 命令绑定在 materialDesign 对话框中的按钮中

WPF Command binding in button inside a materialDesign dialog

我是 WPF 新手,material 设计。我试图制作一个对话框来确认按钮,但是当我绑定命令并按下按钮时,它永远不会到达该方法。

对话框是在动态填充的列表框中创建的。

Window

   <ListBox  Height="585" 
         Name="NoteList"
         ScrollViewer.CanContentScroll="True"
         ScrollViewer.VerticalScrollBarVisibility="Visible" 
         ScrollViewer.HorizontalScrollBarVisibility="Disabled"   
         ItemsSource="{Binding dtoRecetas}" Grid.Row="1">

        <ListBox.ItemTemplate>
            <DataTemplate>

               <!--VERSION CARTAS-->
               <materialDesign:Card Style="{StaticResource cardsRecetas}" >
                  <Grid>
                      <Grid.RowDefinitions>
                           <RowDefinition Height="150"/>
                            <RowDefinition Height="170"/>
                       </Grid.RowDefinitions>

                       <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">

                          <!-- DIALOGO DE ELIMINAR RECETA-->
                          <materialDesign:DialogHost  CloseOnClickAway="True" >
                             <materialDesign:DialogHost.DialogContent>
                                 <StackPanel Margin="16">
                                    <TextBlock>Deseas eliminar esta receta</TextBlock>

                                    <StackPanel Orientation="Horizontal"  HorizontalAlignment="Right">

                                       <Button Style="{StaticResource MaterialDesignFlatButton}"
                                                        IsDefault="True"
                                                        Margin="0 8 8 0"
                                                        Command="{Binding Path=comandoDeleteReceta}"
                                                        CommandParameter="{Binding idReceta}">
                                                    Aceptar
                                       </Button>

                                      <Button Style="{StaticResource MaterialDesignFlatButton}"
                                                        Margin="0 8 8 0"
                                                        Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}">
                                              Cancelar
                                       </Button>
                                     </StackPanel>

                                    </StackPanel>
                              </materialDesign:DialogHost.DialogContent>

                             <Button x:Name="btnDeleteReceta" Style="{StaticResource btnDeleteReceta}" 
                                        Tag="{Binding idReceta}"
                                        Command="{x:Static materialDesign:DialogHost.OpenDialogCommand}">

                                   <materialDesign:PackIcon Kind="RemoveCircle" />

                                </Button>
                          </materialDesign:DialogHost>

                       </StackPanel>


                    </Grid>
                </materialDesign:Card>

            </DataTemplate>

            </ListBox.ItemTemplate>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel  ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled"  ></WrapPanel>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>

ViewModel

 public class VerRecetasViewModel : BaseViewModel 
    {
        public Command comandoDeleteReceta { get; set; }
        public ObservableCollection<DTOReceta> dtoRecetas { get; set; }

        public VerRecetasViewModel()
        {
            RecetasController recController = new RecetasController();
            dtoRecetas = new ObservableCollection<DTOReceta>(recController.getAllRecetas());

            comandoDeleteReceta = new Command();
            comandoDeleteReceta.CanExecuteFunc = obj => true;
            comandoDeleteReceta.ExecuteFunc = deleteReceta;
        }



        public void deleteReceta(object parameter)
        {
            int idReceta = (int)parameter;
            RecetasController recController = new RecetasController();
            recController.deleteReceta(idReceta);
        }


    }

期望的行为是,当他们按下 "Aceptar" 时,它会进入 "deleteReceta" 方法,但就目前而言,它似乎没有找到绑定的命令。

命令 class 正在运行,我以这种方式在其他 windows 中使用命令并且它有效,我认为我丢失了对话框的上下文或创建错误。我试过这种方式并将相对源添加到绑定中,但我不知道祖先类型应该是什么。

感谢您的帮助。

我认为这是 DataContext 的问题。所以我会像这样设置视图的 dataContext : d:DataContext="{d:DesignInstance {x:Type vm:VerRecetasViewModel}}"

然后在 ListBox 中,将命令绑定到按钮上,如下所示:

Command="{Binding DataContext.comandoDeleteReceta, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"

希望对您有所帮助