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
    属性之前

  • 我通过命令从自定义控件内部调用ShowDialog()(从用户控件视图模型中,我通过MVVM Light消息调用视图,然后显示对话框),这是可行的。但当我尝试关闭对话框时,它会再次显示,显示次数与我从菜单中选择不同选项的次数相同

  • 例如,我从一个菜单开始显示对话框,然后关闭按钮工作,然后我转到B菜单并返回A,然后关闭按钮在第二次按下时工作(正在调用两个ShowDialog()),依此类推

    我不知道为了给这篇文章提供更多的上下文,我必须粘贴代码的哪一部分,但是任何输入都将被感激。我被这个(我的)错误卡住了

    代码

    在shell视图上:

    <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);
    }