2013-03-12 2 views
0

У меня есть окно, на которое я загружаю UserControl, скажем Control1. Теперь, если пользователь нажимает на определенную кнопку, новый пользовательский контроллер Control2 должен быть загружен в окне, а Control1 должен исчезнуть. То же самое, когда пользователь нажимает кнопку, должен быть загружен следующий UserControl, Control3 и Control2 должен исчезнуть. Должно быть возможно также вернуться назад, например. от Control3 до Control2.Загрузите несколько UserControls в окне WPF

Загрузка первого основного UserControl в моем окне была простой, я сделал это более чем достаточно. Но я зациклился на том, как реализовать «навигацию» между Usercontrols. Никогда раньше ничего подобного не делал. Я использую MVVM для своего приложения WPF. Есть идеи?

Thx.

Edit: с ответом Рахили теперь я сделать это в команде, чтобы переключить элементы управления: В MainWindow:

<DataTemplate DataType="{x:Type ViewModel:MainControlViewModel}"> 
<my:MainControl /> 
</DataTemplate> 
<DataTemplate DataType="{x:Type ViewModel:ProductsControlViewModel}"> 
<my:ProductsControl /> 
</DataTemplate> 


<Grid> 
<ContentControl Content="{Binding CurrentPageViewModel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
</Grid> 

В MainControlViewModel и почти то же самое в изделияМинимойкиПрочее:

public ICommand LoadProductControlCommand 
{ 
    get 
    { 
    if (_loadProductControl == null) 
     _loadProductControl = new RelayCommand(LoadProductControl); 
    return _loadProductControl; 
    } 
} 

private void LoadProductControl(object notUsed) 
{ 
    _mainWindowViewModel = (MainWindowViewModel) Application.Current.MainWindow.DataContext; 
    _mainWindowViewModel.CurrentPageViewModel = new ProductsControlViewModel(); 
} 

Это хороший способ, или я должен делать это по-другому? Потому что в моем приложении кнопки находятся на элементах управления, а не в главном окне.

+2

Я просто [ответил] (http://stackoverflow.com/a/15365002/302677) другой вопрос по этому вопросу несколько часов назад. Он включает [ссылку на мой блог] (http://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/), который содержит пример кода, иллюстрирующий это для загрузки, если вы хотите. – Rachel

+0

@Rachel, я отредактировал мой вопрос с некоторыми фрагментами кода, которые я использую для вас. У меня это работает так. Можно ли изменить MainWindowViewModel.CurrentPageViewModel в команде управления? Ваша статья в вашем блоге указала мне в правильном направлении. Вы умны и хороши :) Кстати, я не могу отметить ваш ответ в качестве решения, потому что вы добавили его в качестве комментария ... – PitAttack76

+0

Обычно мне не нравятся ссылки на компоненты пользовательского интерфейса, такие как 'Application.Current.MainWindow' из уровня ViewModel. В идеале я предпочел бы привязываться к «ICommand» в ViewModel для изменения страниц или использовать какую-либо систему сообщений для трансляции сообщений ChangePage, на которые может подписаться основной ViewModel. У меня есть [краткий обзор систем обмена сообщениями] (http://rachel53461.wordpress.com/2011/06/05/communication-between-viewmodels-with-mvvm/) в моем блоге, если вы заинтересованы – Rachel

ответ

0

Поместите ContentPresenter в MainWindow, как это:

<ContentPresenter Content="{Binding ActiveWidget}"/> 

, а затем в ViewModel

public ViewModelBase ActiveWidget {get;set;} // Don't forget INotifyPropertyChanged!! 

, то вы должны создать DataTemplate для каждого ViewModel с, соответствующий ему экземпляр UserControl с. См. This Article для общего решения.

Смежные вопросы