我有一个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}}}"/>
....
答案 0 :(得分:2)
您确实创建了两个关闭操作,每个操作都针对特定视图。因此,当调用close操作时,它会引用它正在关闭的视图。
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
答案 1 :(得分:1)
对不起,我的不好:(
非常感谢Jan Walczak帮助我。除非你没有与我分享你的观点,否则无法找到根本原因。
第一次没有正确检查代码。非常抱歉。在代码中,只有一个地方的代码与上面的代码完全相同,但在其他地方,视图是使用新的视图模型创建的,这些视图模型具有自己实现的CloseCommands。
在多个视图使用相同模型的一个位置,视图的CloseAction属性将被覆盖,并且只有最新打开的视图才会被关闭。但在其他地方,由于视图是使用新的视图模型(具有自己的CloseCommand实现)打开的,因此视图会正确关闭。