【问题标题】:How to execute Button Command with Parameter without providing the Parameter when called in the ViewModel?在 ViewModel 中调用时如何在不提供参数的情况下执行带参数的按钮命令?
【发布时间】: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 中的按钮单击,或者更好的是,在不使用按钮单击的情况下显示内容对话框...

标签: c# wpf mvvm winui-3


【解决方案1】:

如果命令希望将 ContentDialog 作为参数传递,您的两个选择是在调用 Execute 之前以编程方式创建这样的 ContentDialog 或获取对现有对话框的引用:

OpenContentDialog.Execute(
    new ContentDialog() { PrimaryButtonText = "OK", IsPrimaryButtonEnabled = true });

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 2016-07-10
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多