【问题标题】:How to determine which View executed a command如何确定哪个 View 执行了命令
【发布时间】:2011-08-10 01:42:22
【问题描述】:

我有一个名为 InformationView.xaml 的视图,这个视图被重新用于显示来自 3 个不同来源的相同信息(每个视图都有不同的窗口标题)。每个 View 的数据上下文都设置了一个 ViewModel 类型的相同实例。在我的 ViewModel 类中,我有一个 ICommand 属性,视图中的“关闭”按钮绑定到该属性。 -- 有没有办法确定谁是命令的发送者? (具体来说,按窗口标题)。

这是一个例子:

我有一个带有以下按钮的视图类(“注意:每个视图将有不同的窗口标题/显示来自不同来源的数据——但使用相同的视图)

<Button Width="75" Height="23" Margin="0,0,5,5" Content="Close" Command="{Binding CloseCommand}" />

我有一个带有以下命令的 ViewModel 类

    public ICommand CloseCommand
    {
        get
        {
            if (this._closeCommand == null)
            {
                this._closeCommand = new RelayCommand(Command => this.OnClose());
            }     
            return _closeCommand;
        }
    }

我正在寻找一种方法来确定哪个窗口执行了命令(我将有多个使用相同 ViewModel 的视图实例)。

【问题讨论】:

  • 您能否详细说明为什么您需要知道哪个视图调用了关闭命令?
  • 根据哪个View执行了命令,会执行不同的方法
  • 你不会为每个行为派生一个新的 ViewModel 并覆盖 OnClose() 方法吗?
  • 是的,到目前为止,我认为这可能是最好的方法。总的来说,我想要同一个 ViewModel 的一个实例,并且根据哪个 View 执行了命令,ViewModel 将调用一个特定的方法。我正在考虑拥有一个支持所有类型视图的整体 ViewModel。我希望 XAML 中有一种方法可以将参数传递给我的 ViewModel。
  • 可以使用 CommandParameter 属性将数据发送到 ViewModel,但是为您想要的不同行为派生一个新的 ViewModel 将是更好的方法。我经常将同一个 View 与从同一个基础派生的几个不同的 ViewModel 类重用。

标签: c# .net wpf mvvm


【解决方案1】:

我不确定我是否理解正确。但是,您可以实现Unloaded 事件。在该事件方法内设置断点,并在您遇到断点时设置断点。您可以检查该视图的窗口标题属性。

【讨论】:

  • 感谢您的回复,但马特·汉密尔顿(见上面的 cmets)将我推向正确的方向,了解如何完成此任务。
【解决方案2】:

Close() 方法公开,以便其他对象可以指定关闭行为应该是什么?

在您的InformationViewModel 中有类似的内容:

public event EventHandler RequestClose;

void OnRequestClose()
{
    EventHandler handler = this.RequestClose;
    if (handler != null)
        handler(this, EventArgs.Empty);
}

然后您可以在其他视图模型中使用它,如下所示:

InformationViewModel.Close += CloseMethod;

public CloseMethod(object sender, EventArgs e)
{
    // Implement close logic here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 2019-07-09
    • 1970-01-01
    • 2022-01-08
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多