【发布时间】:2021-10-19 17:39:34
【问题描述】:
我是 MVVM 模式的新手,我只是想问一下从 ViewModel 中“单击”或执行具有 contentdialog 命令参数的按钮命令的最佳方式是什么。
示例代码: 查看
<Button Command="{x:Bind ViewModel.OpenContentDialog}" CommandParameter="{Binding ElementName=DialogBox}" Grid.Row="0" Grid.Column="3">Open Dialog</Button>
<ContentDialog x:Name="DialogBox"
PrimaryButtonText="OK" IsPrimaryButtonEnabled="{Binding PrimaryButtonEnabled}"
CloseButtonText="Cancel">
<ContentDialog.TitleTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Dialog"/>
</StackPanel>
</DataTemplate>
</ContentDialog.TitleTemplate>
...
视图模型
public RelayCommand<object> OpenContentDialog => new RelayCommand<object>((dialog) => { SortDialog(dialog); });
我想在另一个 ViewModel 方法中调用 OpenContentDialog 命令,如下所示:
OpenContentDialog.Execute(); //needs the parameter
我尝试将实际的 ContentDialog 作为 ViewModel 对象传递,它可以工作,但我不确定这是否违反了 MVVM 模式。
【问题讨论】:
-
命令通常不应该被代码调用,当然这是可能的。在 ViewModel 中维护一个 Control-Instance 似乎不是一个好习惯。您能否提供有关
SortDialog(object param)的详细信息。它在做什么? -
确保它基本上只显示带有 ShowAsync 的内容对话框并等待 contentdialogresult
-
所以当您按下按钮时,实际上并没有显示对话框...?或者这些元素不在同一个 XAML 中?我承认,我还没有使用 winui,我在 WPF 上。从这个角度来看,您作为 CommandParameter 传递的
DialogBox将是包含按钮的 Visual 的一部分 :-) -
不,绑定在按钮上的中继命令实际上会在单击时显示内容对话框。我想要实现的事情是以编程方式调用 ViewModel 中的按钮单击,或者更好的是,在不使用按钮单击的情况下显示内容对话框...