2014-11-14 3 views
1

Я довольно новичок в разработке WPF, и в настоящее время я пытаюсь использовать MVVM для разработки моих приложений. Я много читал о просмотрах навигации и переключения MVVM, но я не могу найти решение для текущей ситуации. Поясним, что это такое: Прежде всего, у меня есть мой основной вид элемент, DockPanel, с некоторыми фиксированными зонами, а также главной «динамической» область, где содержание должно меняться в зависимости от действий:навигация/загрузка различных представлений на WPF/MVVM

<DockPanel> 
    <Label Content="Top Fixed element"/> 
    <StackPanel Orientation="Vertical" Height="auto" Width="150" DockPanel.Dock="Left"> 
     <Label Content="SomeOptions"/> 
     <!-- some more elements --> 
    </StackPanel> 
    <Label DockPanel.Dock="Bottom" Content="Foot"/>   
    <ContentControl Content="{Binding CurrentMainViewElementViewModel}"/>   
</DockPanel> 

Я определил некоторые DataTemplates, что я хотел бы загрузить в этом ContentControl, здесь есть один из шаблонов данных в качестве примера:

<Window.Resources> 
    <DataTemplate DataType="{x:Type ViewModel:FileLoaderVM}"> 
     <View:FileLoaderView/> 
    </DataTemplate> 
</Window.Resources> 

Это FileLoader (и вид модели выполнены с использованием RelayCommand и INotifyPropertyChanged) открывает диалоговое окно после нажатия кнопки, где после выбора файла он открывается и анализируется, и sh все найденные элементы внутри ListView с множественным выбором (в данном случае лицами с их данными). Теперь я хочу загрузить другой элемент управления пользователя в этом ContentControl, когда я нажимаю кнопку. Эта кнопка определяется в моей модели представления, как это:

public ICommand LoadPersons 
    { 
     get { return new RelayCommand(param => this.loadSelectedPersons(), param => (SelectedPersons!=null && SelectedPersons.Any()));} 
    } 

Мой вопрос приходит в этот момент, как я могу изменить содержание ContentControl, загружая другой пользовательский элемент управления вместо текущего непосредственно с моей точки зрения модели (в этом «this.loadSelectedPersons()»)? Если это невозможно, как мне подойти, чтобы решить эту проблему? Рядом с этим действием я хочу показать все ранее выбранные элементы и манипулировать различными способами (вставка в БД, сохранение в другом файле и т. Д.), И у меня уже есть для этого соответствующий элемент управления пользователя, который я бы как показано в элементе моего основного вида в разделе ContentControl, сохраняя остальные элементы, поскольку они изначально.

+0

Вы возвращаете новую ICommand при каждом обращении к объекту? Это совсем не так. – Will

ответ

1

позволяет узнать, прав ли я.

у вас есть mainviewmodel с свойством (CurrentMainViewElementViewModel), связанным с ContentControl. ваш MainViewmodel устанавливает FileLoaderVM в это свойство. теперь вы хотите показать «новую/другую» модель Viewmodel, когда файл будет удален в FileLoaderVM?

Почему вы не просто выставляете событие из своего FileLoaderVM и подписываетесь на это событие в своем MainViewModel? если вы сделаете это ваш MainViewModel может затем установить «новый/другой» ViewModel к ContentControl

+0

Ваше решение сработало для меня, спасибо за ваш ответ. – estradjs

1

Чтобы изменить содержание ContentControl вы не нагрузки другого пользовательского элемента управления, но изменить значение CurrentMainViewElementViewModel (к которому ContentControl.Content связан) к новой ViewModel, которая будет загружать еще один UserControl (определенный в DataTemplate так же, как и FileLoaderVM).

Это выглядит как работа для main ViewModel (где находится CurrentMainViewElementViewModel).

простое решение состоит в создании способа в том, что ViewModel

public Switch() 
{ 
    CurrentMainViewElementViewModel = SomeViewModel; 
} 

и вызвать этот метод из FileLoaderVM.

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