C# 在materialDesign对话框内的按钮中绑定WPF命令
我是WPF和材料设计的新手。我正试图创建一个对话框来确认一个按钮,但是当我绑定命令并按下按钮时,它永远不会到达方法 该对话框是在动态填充的列表框中创建的 窗口C# 在materialDesign对话框内的按钮中绑定WPF命令,c#,wpf,xaml,data-binding,material-design-in-xaml,C#,Wpf,Xaml,Data Binding,Material Design In Xaml,我是WPF和材料设计的新手。我正试图创建一个对话框来确认一个按钮,但是当我绑定命令并按下按钮时,它永远不会到达方法 该对话框是在动态填充的列表框中创建的 窗口 <ListBox Height="585" Name="NoteList" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible"
<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>
以利米纳酒店
接受器
取消者
视图模型
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);
}
}
公共类VerreceitasViewModel:BaseViewModel
{
公共命令comandodeleterecta{get;set;}
公共可观测集合dtoRecetas{get;set;}
公共VerreceitasViewModel()
{
ReceitasController recController=新的ReceitasController();
dtoRecetas=新的ObservableCollection(recController.getAllRecetas());
comandoDeleteReceta=新命令();
comandodeleterecta.CanExecuteFunc=obj=>true;
comandodeleterecta.ExecuteFunc=deleterecta;
}
public void deleteReceta(对象参数)
{
int idReceta=(int)参数;
ReceitasController recController=新的ReceitasController();
recController.deleteReceta(idReceta);
}
}
所需的行为是,当他们按下“Aceptar”时,它会进入“deleteReceta”方法,但现在看起来它似乎没有找到bind命令。
command类正在工作,我在其他窗口中以这种方式使用命令,它工作正常,我认为我正在从对话框中丢失上下文或创建错误的对话框。我尝试了这种方法,并将相对源添加到绑定中,但我不知道ancestortype应该是什么
谢谢你的帮助。我认为这是DataContext的问题。因此,我将视图的dataContext设置为:
d:DataContext=“{d:DesignInstance{x:Type vm:verrecestasviewmodel}”
在列表框中,按如下方式绑定按钮上的命令:
Command="{Binding DataContext.comandoDeleteReceta, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
希望这有帮助这不是命令实现的问题,我已经在一个类命令中使用了它,略有不同,但它可以在其他windows和viewmodels中使用。我试过你的版本,但也没用。问题是按钮找不到命令或视图模型,我不知道如何将其数据上下文更改为视图模型或正确使用相对源。我已编辑了答案,请再次查看,如果有帮助,请告诉我:)成功了!非常感谢,我喜欢WPF,但是我在绑定方面做了很多努力。现在,我将idReceta作为命令参数访问,该命令参数位于集合的卡中(CommandParameter=“{Binding idReceta}”从现在开始)。我应该也使用这个相对的来源吗?再次感谢您的帮助!是的,你可以试试。我还认为,如果您尝试为菜谱编写一个ViewModel类,那么将来会更好,因此类似于
RecetaViewModel
和VerRectasViewModel
的东西都有一个列表。这样,您可以分别处理它们中的每一个,对它们执行操作的代码将在RecetaViewModel
中处理。如果您想添加/删除,可以在verrecestasviewmodel
中处理。希望它有意义