KeyBinding увеличивает свои вызовы команд - PullRequest
0 голосов
/ 03 апреля 2012

Таким образом, мое приложение представляет собой оболочку с ContentControl, которую я заполняю пользовательскими UserControl в зависимости от выбора пользователем меню.

Но сейчас у меня странное поведение.

Я прикрепил свойство Content ContentControl к свойству ViewModel, которое я создаю по требованию. Это прекрасно работает, но у меня две проблемы.

  1. Когда я выбираю один параметр меню, он создает новый экземпляр указанного UserControl и задает свойство Content оболочки. Это работает, потому что я вижу элемент управления и могу взаимодействовать с ним, и когда я выбираю другой параметр из меню, он показывает мне другой UserControl, но, когда я снова выбираю ранее выбранный параметр, он, кажется, загружает тот же самый ранее созданный элемент управления (правильный, но со старым вводом, и я делаю новый XXXControl () перед тем, как установить его как свойство Content ContentControl.

  2. Я вызываю ShowDialog () из пользовательского элемента управления с помощью команд (из модели представления пользовательского элемента управления я вызываю представление с помощью обмена сообщениями MVVM Light, а затем отображаю диалоговое окно), и это работает. Но когда я пытаюсь закрыть диалоговое окно, оно показывает его снова столько же раз, я выбираю различные опции из меню.

Например, я начинаю с меню A и показываю диалоговое окно, затем кнопка закрытия работает, затем я перехожу в меню B и возвращаюсь к A, затем кнопка закрытия работает при втором нажатии (вызывается два ShowDialog () ) и так далее ...

Я не знаю, какую часть кода я должен вставить, чтобы дать немного больше контекста этому посту, но любой вклад будет оценен. Я застрял с этой (моей) ошибкой.

Код

На оболочке вид:

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

На оболочке ViewModel:

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

На внутреннем виде (SearchDocumentView):

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

На внутреннем виде (SearchDocumentView) xaml:

<ListBox x:Name="SearchResults"  ItemsSource="{Binding SearchResults}" SelectedItem="{Binding SelectedSearchResult}">
            <ListBox.InputBindings>
                <KeyBinding
                            Key="Enter"
                            Command="{Binding ViewResult}" />
                <KeyBinding
                            Key="Return"
                            Command="{Binding ViewResult}" />
            </ListBox.InputBindings>
            ...

На внутреннем представлении (SearchDocumentView) ViewModel:

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

1 Ответ

1 голос
/ 03 апреля 2012

Почему вы видите ваши старые данные, я не могу видеть прямо сейчас - но я предполагаю, что вы используете те же (модель) -данные для вновь созданного представления.

Вторая проблема должна быть здесь:

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

Для каждого нового просмотра вы регистрируете Уведомление, в котором будет отображаться окно вашего сообщения, но я не вижу, отмените ли вы их регистрацию, и если вы этого не сделаете, обработчик будет удерживать модель представления в памяти и по-прежнему отображать сообщения.ящики.

Даже если я ошибся (это ваша «управляющая» -модель?), это должно быть что-то очень похожее, но вы можете легко найти это, установив точку останова на .Show в вашем сообщении.и глядя на стек вызовов при отладке.

...