【问题标题】:Wpf MVVM button call method in view and view model also视图和视图模型中的 Wpf MVVM 按钮调用方法
【发布时间】:2015-07-28 07:45:08
【问题描述】:

在我的 MVVM 应用程序中,视图中有一个按钮。 当我按下按钮时,我希望在视图中运行一些方法,以及在视图模型中运行一些方法。 我将来命令连接到我的按钮,因此该命令可以在视图模型中运行某些方法。但是我怎样才能在视图中运行一些方法呢? 我也尝试连接点击事件,但它不起作用。 从视图和视图模型中运行函数的最佳方式是什么。

谢谢,

【问题讨论】:

  • Another approach:绑定到视图代码中的命令,然后通过该 VM 实现的接口调用视图模型。

标签: wpf mvvm


【解决方案1】:

您可以使用交互触发器完全在 XAML 中执行此操作:

    <Button Content="Do Something" Click="OnClickHandler"
            xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
            xmlns:cmd ="http://www.galasoft.ch/mvvmlight">

        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <cmd:EventToCommand Command="{Binding Path=ViewModelCommand1}" />
                <cmd:EventToCommand Command="{Binding Path=ViewModelCommand2}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </Button>

在这种情况下,窗口处理程序和两个视图模型命令中的每一个都会被调用。如果处理程序将 e.Handled 设置为 true,则不会调用 viewmodel 命令。如果您在 cmd:EventToCommand 中设置 PassEventArgsToCommand="True" 那么您可以指定一个接受参数的处理程序;在第一个 viewmodel 处理程序中将 Handled 设置为 true 不会停止调用第二个处理程序,但您仍然可以手动检查第二个处理程序中的值。

现在,也就是说我会强烈鼓励您重新评估您的架构。调用代码隐藏不是 MVVM,在每天这样做的 7 年多的时间里,我还没有看到一个实际需要它的案例。

【讨论】:

  • 调用后面的代码没问题,如果是视图后面的代码中的视图相关代码,仍然是MVVM。不过,您的其余答案仍然是 +1。
  • 问题在于,一般来说,您放置在代码后面的任何代码都经过单元测试,而无法测试的代码确实不应该在商业质量的应用程序中。原则上我确实同意你的观点,不是特定于应用程序的自定义控件可能是一个很好的例子,其中代码隐藏在不破坏 MVVM 的情况下节省了很多麻烦,但根据我的经验,除了最简单的界面组件之外,它排除了所有其他组件。
【解决方案2】:

在 Click 事件上,执行命令。

private void btnClick(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            btn.Command.Execute(btn.CommandParameter);
        }

【讨论】:

  • 如果按钮已经有命令集,这肯定不行吗?正如OP已经提到的。好主意。
  • 是的,您必须从 xaml 命令设置并从视图文件中调用命令,我建议这样做是因为他想同时调用两者,在这种情况下,这是他可以实现的可能方式
【解决方案3】:

我强烈质疑您“在单击按钮时同时运行视图和视图模型方法”的决定。对我来说,您似乎想要的是该按钮运行一个 viewmodel 命令,这反过来会导致视图发生一些变化。例如,如果可以不通过 UI 而是从应用程序的其他地方执行该方法,该怎么办。视图不应该也改变吗?

为此,我建议创建一个接口 I[something]View,视图将实现该接口并且视图模型可以引用该接口。然后,viewmodel 可以调用界面上的方法,该方法将在单击按钮时执行您所期望的操作。

【讨论】:

  • @Matvey 它没有对视图的引用,它对抽象的引用告诉视图对它的期望。依赖方向还是一样的。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2016-04-26
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多