CloseCommand实现,多个视图,单个模型

时间:2016-07-12 11:23:31

标签: wpf

我有一个CloseCommand实现,用于关闭来自ViewModels的视图(正如在几个帖子/博客中讨论的那样),它完美地运行,但我对这种行为感到困惑(无法理解逻辑)。 (我删除了原始冗长的代码并将其替换为简化版本,该版本应该能够传达我想要提出的问题)

在模型(Model1)中,我有以下参数和属性

private Action _closeAction;
private ICommand _closeCommand;
.....
public Action CloseAction { set { SetProperty(ref _closeAction, value); } }
public ICommand CloseCommand { get { return _closeCommand; } }

SetProperty在基类中实现如下..

protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
    if(Equals(storage, value))
        return false;
    storage = value;
    this.OnPropertyChanged(propertyName);
    return true;
}

在模型构造函数中,我已将close命令初始化为以下

_closeCommand = new RelayCommand(param=>this._closeAction());

我在主模型(ModelX)中有多个命令实现,它们创建了新的视图,例如以下两个(在每个实现中,相同的模型作为命令参数传递)...

private void ShowView1(object param)
{
    Model1 model = param as Model1;
    View1 view = new View1();
    view.Owner = Application.Current.MainWindow;
    view.DataContext = model;
    model.CloseViewAction = new Action(view.Close);
    view.Show();
}

private void ShowView2(object param)
{
    Model1 model = param as Model1;
    View2 view = new View2();
    view.Owner = Application.Current.MainWindow;
    view.DataContext = model;
    model.CloseViewAction = new Action(view.Close);
    view.Show();
}

and so on for multiple other views...

在每个视图上,我都有一个关闭按钮,它具有绑定到CloseCommand

Command="{Binding CloseViewCommand}"

现在,当使用上述方法打开多个视图时,如果我单击视图上的关闭按钮,则该特定视图将被关闭,而不是其他视图。

现在我的问题是,在打开每个新视图时,使用新视图的close函数设置相同的单个模型的CloseAction属性。因此,关闭命令不应该触发关闭最新视图,而不是正确的视图。

请帮助我了解背后发生的事情。

谢谢&amp;此致

使用主模型/查看信息进行编辑

在我的Master ViewModel中,我有以下命令..

private ICommand _showView1Command, _showView3Command, _showView3Command...

在构造函数

_showView1Command = new RelayCommand(param=>this.ShowView1(param));
_showView2Command = new RelayCommand(param=>this.ShowView2(param));
_showView3Command = new RelayCommand(param=>this.ShowView3(param));
...

属性

public ICommand ShowView1Command { get {return this._showView1Command;} }
public ICommand ShowView2Command { get {return this._showView2Command;} }
public ICommand ShowView3Command { get {return this._showView3Command;} }
...
在主视图中的

我有带有项目数据模板的ItemsControl,其中包含以下菜单条目

<MenuItem Header="View1" CommandParameter="{Binding DataContext, RelativeSource={RelativeSource Self}}" Command="{Binding Path=DataContext.ShowView1Command, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
<MenuItem Header="View2" CommandParameter="{Binding DataContext, RelativeSource={RelativeSource Self}}" Command="{Binding Path=DataContext.ShowView2Command, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
<MenuItem Header="View3" CommandParameter="{Binding DataContext, RelativeSource={RelativeSource Self}}" Command="{Binding Path=DataContext.ShowView3Command, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
....

2 个答案:

答案 0 :(得分:2)

您确实创建了两个关闭操作,每个操作都针对特定视图。因此,当调用close操作时,它会引用它正在关闭的视图。

<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>

答案 1 :(得分:1)

对不起,我的不好:(

非常感谢Jan Walczak帮助我。除非你没有与我分享你的观点,否则无法找到根本原因。

第一次没有正确检查代码。非常抱歉。在代码中,只有一个地方的代码与上面的代码完全相同,但在其他地方,视图是使用新的视图模型创建的,这些视图模型具有自己实现的CloseCommands。

在多个视图使用相同模型的一个位置,视图的CloseAction属性将被覆盖,并且只有最新打开的视图才会被关闭。但在其他地方,由于视图是使用新的视图模型(具有自己的CloseCommand实现)打开的,因此视图会正确关闭。