Таким образом, мое приложение представляет собой оболочку с ContentControl
, которую я заполняю пользовательскими UserControl
в зависимости от выбора пользователем меню.
Но сейчас у меня странное поведение.
Я прикрепил свойство Content
ContentControl
к свойству ViewModel, которое я создаю по требованию. Это прекрасно работает, но у меня две проблемы.
Когда я выбираю один параметр меню, он создает новый экземпляр указанного UserControl
и задает свойство Content
оболочки. Это работает, потому что я вижу элемент управления и могу взаимодействовать с ним, и когда я выбираю другой параметр из меню, он показывает мне другой UserControl
, но, когда я снова выбираю ранее выбранный параметр, он, кажется, загружает тот же самый ранее созданный элемент управления (правильный, но со старым вводом, и я делаю новый XXXControl () перед тем, как установить его как свойство Content
ContentControl
.
Я вызываю 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 ));
}
}