2013-03-20 2 views
0

То, что я пытаюсь сделать, очень просто, но я, возможно, собираюсь сделать это неправильно. Мне по существу нужен способ показать разные представления из одного окна. Пример того, что у меня есть, что работает прямо сейчас это:Как я могу отображать несколько UserControls внутри одного окна?

<Window x:Class="MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="800" Width="800" 
     DataContext="{Binding Source={StaticResource Locator}, Path=MainPageViewModel}"> 
    <Grid> 
     <ContentPresenter Content="{Binding SelectedView}"/> 
    </Grid> 
</Window> 

С выше, теперь я могу изменить UserControl, установив его на что-то другое в SelectedView. Однако, я думаю, это может нарушить MVVM. Теперь, когда у вас есть представление о том, что я пытаюсь сделать, пожалуйста, порекомендуйте лучший способ, если он существует. Я просто пытаюсь создать разные представления в приложении, не создавая больше окон и т. Д.

+2

Это в значительной степени, как я это делаю, и это путь mvvm. Selectedview - это производный класс класса базового представления, который реализует INPC. Я использую contentcontrol и создаю несколько datatemplates, которые изменяют отображаемый пользовательский элемент управления, на основе которого тип viewmodel загружается в выбранном представлении. Одна вещь, которую я не делаю, - это привязать DataCointext к окну. Я переопределяю App.xaml.cs OnStartup и вручную назначаю DataContext моей модели mainwindowview – failedprogramming

ответ

1

MVVM может быть или не быть таким. MVVM вы создали свой ViewModel, чтобы быть вашим кодом, а затем выполните библиотеку ресурсов, чтобы передать представление, которое оно относится к модели представления. То, что вы делаете, является просто обязательным. Если вы делаете весь свой код в коде позади «MainWindow», который почти не подчиняется MVVM.

Вы также можете создать несколько представлений, а затем отобразить их, я верю в разные панели DOCKING PANELS. Я делал это только до того, как начал использовать MVVM, и я показывал только по одному, но я думаю, вы могли бы сделать более легко.

XAML:

<DockPanel x:Name="MainDock" LastChildFill="True"> 
     <StackPanel DockPanel.Dock="Top"> 
      <StackPanel.Background> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="Black" Offset="0" /> 
        <GradientStop Color="#FF759FCB" Offset="1" /> 
       </LinearGradientBrush> 
      </StackPanel.Background> 

       <Menu Background="Transparent" > 
        <Menu.ItemsPanel> 
         <ItemsPanelTemplate> 
          <UniformGrid Rows="1"/> 
         </ItemsPanelTemplate> 
        </Menu.ItemsPanel> 
        <MenuItem Grid.Column="0" x:Name="mnuBasic" Header="Basic Batch" Click="mnuBasic_Click" /> 
        <MenuItem Grid.Column="1" x:Name="mnuImages" Header="Image List" Click="mnuFENSImages_Click" /> 
        <MenuItem Grid.Column="2" x:Name="mnuReRender" Header="ReRender Batch" Click="mnuReRender_Click"/> 
       </Menu> 
     </StackPanel> 

     <DockPanel x:Name="dockcontent" DockPanel.Dock="Right" /> 
    </DockPanel> 

Я бы тогда часть называется 'dockcontent' заполняется данные с пунктами меню щелкнули. Пример кода для заполнения стыковки:

Exporter exp = new Exporter(); //constructor args if needed, this is a user control 

dockcontent.Children.Clear(); // clear the dockpanel so nothing already exists 
dockcontent.Children.Add(exp); // populate the dock with my user control 

Я думаю, вы могли бы сделать это несколькими способами для создания нескольких изображений. Вы могли бы выполнить привязку, которую я ожидаю непосредственно в XAML, пока ваш объект является представлением в правильном контексте.

Просто помните, что чрезмерный код позади в основном не соответствует MVVM. Поскольку точкой MVVM является выделение вашей презентации из вашего кода, не используйте их вместе.

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