KeyBinding递增其命令调用

时间:2012-04-03 03:48:05

标签: c# wpf mvvm-light

所以我的应用程序基本上是一个ContentControl的shell,我根据用户对菜单的选择来填充自定义UserControl

但现在我有一种奇怪的行为。

我已将Content的{​​{1}}属性附加到我根据需要实例化的ViewModel属性。这很好但我有两个问题。

  1. 当我选择菜单的一个选项时,它会创建指定ContentControl的新实例,并将UserControl属性设置为shell。这是有效的,因为我看到控件并可以与它交互,当我从菜单中选择另一个选项时,它会向我显示另一个Content,但是,当我再次选择先前选择的选项时,它似乎正在加载相同的先前实例化控件(正确的控件,但使用较旧的输入,我正在执行新的XXXControl(),然后将其设置为UserControl的{​​{1}}属性。

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

  3. 例如,我从A菜单开始并显示对话框,然后关闭按钮工作,然后我进入B菜单并返回A,然后关闭按钮在第二次按下时工作(两个ShowDialog()被调用)等等......

    我不知道我必须粘贴哪部分代码才能为这篇文章提供更多的上下文,但任何输入都将受到赞赏。我坚持这个(我的)错误。

    代码

    在shell视图中:

    Content

    在shell上查看ViewModel:

    ContentControl

    在内部视图(SearchDocumentView)上:

    <ContentControl Grid.Row="2" Content="{Binding CurrentView}" Margin="15,10"/>
    

    在内部视图(SearchDocumentView)xaml:

    if (action == null || action == SEARCH_ACTION)
        {
            ActionsMenuSelected = SEARCH_ACTION;
            var view = new SearchDocumentView();
            CurrentView = view;
        }
    

    在内部视图(SearchDocumentView)ViewModel:

    public SearchDocumentView()
    {
        InitializeComponent();
        Messenger.Default.Register<NotificationMessage<Entity>>(this, NotificationMessageReceived);
    }
    
    
    private void NotificationMessageReceived(NotificationMessage<Entity> msg)
    {
        if (msg.Notification == "ViewResult")
        {
            var view = new DocumentViewer( ServiceLocator.Current.GetInstance<IDataService>(),msg.Content);
            view.ShowDialog();
        }
    }
    

1 个答案:

答案 0 :(得分:1)

为什么你看到我现在看不到的旧数据 - 但我猜你对新创建的视图使用相同的(模型)数据。

第二个问题应该在这里:

public SearchDocumentView()
{
    InitializeComponent();
    Messenger.Default.Register<NotificationMessage<Entity>>(this, NotificationMessageReceived);
}

对于每个新视图,您都会注册一个通知,它会显示您的消息框,但我不知道您是否取消注册这些消息,如果您不处理该处理程序将视图模型保留在内存中并仍然显示消息框。

即使我弄错了(这是你的&#34;控件&#34; -viewmodel?),它应该是非常相似的东西,但你可以通过设置断点到.Show来轻松找到它你的消息,并在调试时查看callstack。