C# KeyBinding递增其命令调用
因此,我的应用程序基本上是一个带有C# KeyBinding递增其命令调用,c#,wpf,mvvm-light,C#,Wpf,Mvvm Light,因此,我的应用程序基本上是一个带有ContentControl的shell,根据用户对菜单的选择,我用自定义UserControl填充它 但现在我有一种奇怪的行为 我已经将ContentControl的Content属性附加到一个ViewModel属性,我会根据需要实例化该属性。这很好,但我有两个问题 当我选择菜单的一个选项时,它会创建指定的UserControl的新实例,并设置shell的Content属性。这是可行的,因为我看到了控件并可以与之交互,当我从菜单中选择另一个选项时,它会显示另一
ContentControl
的shell,根据用户对菜单的选择,我用自定义UserControl
填充它
但现在我有一种奇怪的行为
我已经将ContentControl
的Content
属性附加到一个ViewModel属性,我会根据需要实例化该属性。这很好,但我有两个问题
UserControl
的新实例,并设置shell的Content
属性。这是可行的,因为我看到了控件并可以与之交互,当我从菜单中选择另一个选项时,它会显示另一个UserControl
,但是,当我再次选择先前选择的选项时,它似乎正在加载相同的先前实例化的控件(右边的一个,但使用较旧的输入,我正在执行一个新的XXXControl()在将其设置为ContentControl
的Content
属性之前<ContentControl Grid.Row="2" Content="{Binding CurrentView}" Margin="15,10"/>
在内部视图(SearchDocumentView)上:
publicsearchDocumentView()
{
初始化组件();
Messenger.Default.Register(此为NotificationMessageReceived);
}
收到私有无效NotificationMessage(NotificationMessage消息)
{
如果(msg.Notification==“ViewResult”)
{
var view=newdocumentviewer(ServiceLocator.Current.GetInstance(),msg.Content);
view.ShowDialog();
}
}
在内部视图(SearchDocumentView)xaml上:
...
在内部视图(SearchDocumentView)视图模型上:
if (action == null || action == SEARCH_ACTION)
{
ActionsMenuSelected = SEARCH_ACTION;
var view = new SearchDocumentView();
CurrentView = view;
}
private RelayCommand _viewResut;
/// <summary>
/// Gets the ViewResult.
/// </summary>
public RelayCommand ViewResult
{
get
{
return _viewResut
?? (_viewResut = new RelayCommand(
() =>
{
MessengerInstance.Send(new NotificationMessage<Entity>((Entity)SelectedSearchResult, "ViewResult"));
},
() => ((Entity)SelectedSearchResult!=null)?true:false ));
}
}
private RelayCommand\u view result;
///
///获取ViewResult。
///
公共关系命令查看结果
{
得到
{
返回_viewret
??(_viewResut=新继电器命令(
() =>
{
Send(newnotificationmessage((实体)SelectedSearchResult,“ViewResult”);
},
()=>((实体)SelectedSearchResult!=null)?真:假);
}
}
为什么您会看到我现在看不到的旧数据-但我猜您在新创建的视图中使用了相同的(模型)数据
第二个问题应该在这里:
public SearchDocumentView()
{
InitializeComponent();
Messenger.Default.Register<NotificationMessage<Entity>>(this, NotificationMessageReceived);
}
publicsearchDocumentView()
{
初始化组件();
Messenger.Default.Register(此为NotificationMessageReceived);
}
对于每个新视图,您都会注册一个通知,该通知将显示您的消息框,但我看不出您是否注销了这些消息框,如果不注销,处理程序将在内存中保存viewmodel,并且仍会显示消息框
即使我弄错了(这是你的“控件”-视图模型吗?)这应该非常类似,但您可以通过在消息上设置断点
.Show
,并在调试时查看调用堆栈来轻松找到这一点。将xaml代码粘贴到设置内容的位置,并将代码粘贴到实例化用户控件的位置。还有调用ShowDialog()的代码段.@sreedharalbnaick刚刚编辑了我的答案。谢谢。谢谢@Carsten,事实上你是对的。我使用IoC容器解析ViewModel,然后使用同一个实例。现在,对于第二个问题,我不知道如何取消注册视图(不知道取消注册ViewModel会有什么帮助)您好,据我所知(这里没有代码),在IMessenger
(?)界面上应该有一个Unregister
方法(在Messenger.Default
上也是如此,因为它需要收件人(所以用Messenger.Default.Unregister(这个);
)-se here:备注:博客条目说MVVM light使用弱引用,因此您看到的“消息”数量应该随着时间的推移而减少,就像侧节点一样;)
private RelayCommand _viewResut;
/// <summary>
/// Gets the ViewResult.
/// </summary>
public RelayCommand ViewResult
{
get
{
return _viewResut
?? (_viewResut = new RelayCommand(
() =>
{
MessengerInstance.Send(new NotificationMessage<Entity>((Entity)SelectedSearchResult, "ViewResult"));
},
() => ((Entity)SelectedSearchResult!=null)?true:false ));
}
}
public SearchDocumentView()
{
InitializeComponent();
Messenger.Default.Register<NotificationMessage<Entity>>(this, NotificationMessageReceived);
}