2015-03-30 2 views
0

Я пишу приложение wpf и реализую инструмент mvvm light. Графический интерфейс выглядит так: enter image description hereУправление содержимым Bind зависит от кнопки пользователя.

Каждый раз, когда пользователь нажимает кнопку, он должен изменять содержимое с правой стороны, обозначенное красной рамкой. Код XAML:

<igWpf:XamRibbonWindow x:Class="BackupCustomizing.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:ignore="http://www.ignore.com" 
     xmlns:ig="http://schemas.infragistics.com/xaml" 
     xmlns:views="clr-namespace:BackupCustomizing.Views" 
     xmlns:igWpf="http://schemas.infragistics.com/xaml/wpf" 
     mc:Ignorable="d ignore" 
     Height="400" 
     Width="700" 
     Title="Backup customizing V0.1" 
     DataContext="{Binding Main, Source={StaticResource Locator}}" ResizeMode="NoResize"> 

    <igWpf:XamRibbonWindow.Resources> 
     <DataTemplate DataType="{x:Type views:ServerView}"></DataTemplate> 
    </igWpf:XamRibbonWindow.Resources> 

    <ig:ThemeManager.Theme> 
     <ig:Office2013Theme /> 
    </ig:ThemeManager.Theme> 
    <igWpf:RibbonWindowContentHost x:Name="_content" 
            Theme="Office2013" 
            igWpf:RibbonWindowContentHost.ApplicationAccentColor="#0072C6"> 
     <Grid x:Name="LayoutRoot"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="200"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <views:NavigationView Grid.Column="0"/> 
      <ContentPresenter Content="{Binding}" Grid.Column="1"/> 
     </Grid> 

    </igWpf:RibbonWindowContentHost> 
</igWpf:XamRibbonWindow> 

и код позади:

using System.Windows; 
using BackupCustomizing.ViewModel; 
using Infragistics.Themes; 
using Infragistics.Windows.Ribbon; 

namespace BackupCustomizing 
{ 
    /// <summary> 
    ///  Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : XamRibbonWindow 
    { 
     /// <summary> 
     ///  Initializes a new instance of the MainWindow class. 
     /// </summary> 
     public MainWindow() 
     { 
      InitializeComponent(); 
      Closing += (s, e) => ViewModelLocator.Cleanup(); 

     } 
    } 
} 

Как вы можете видеть выше код, я попытался с:

<igWpf:XamRibbonWindow.Resources> 
      <DataTemplate DataType="{x:Type views:ServerView}"></DataTemplate> 
</igWpf:XamRibbonWindow.Resources> 

и ведущий контент:

<ContentPresenter Content="{Binding}" Grid.Column="1"/> 

и здесь я поставил, как сотрудничать ntinue?

Код ViewModel:

using BackupCustomizing.Model; 
using GalaSoft.MvvmLight; 

namespace BackupCustomizing.ViewModel 
{ 
    /// <summary> 
    ///  This class contains properties that the main View can data bind to. 
    ///  <para> 
    ///   See http://www.galasoft.ch/mvvm 
    ///  </para> 
    /// </summary> 
    public class MainViewModel : ViewModelBase 
    { 

     private readonly IDataService _dataService; 
     private string _welcomeTitle = string.Empty; 

     /// <summary> 
     ///  Initializes a new instance of the MainViewModel class. 
     /// </summary> 
     public MainViewModel(IDataService dataService) 
     { 
      _dataService = dataService; 
      _dataService.GetData(
       (item, error) => 
       { 

       }); 
     } 
    } 
} 

ответ

1

Чтобы получить ваш код работает в минимальные изменения

public class MainViewModel : ViewModelBase 
    { 

     private readonly IDataService _dataService; 
     private string _welcomeTitle = string.Empty; 
     private ViewModelBase detailsViewModel = null; 
     public ViewModelBase DetailsViewModel{ 
      get { return detailsViewModel;} 
      set { detailsViewModel = value; RaisePropertyChanged("DetailsViewModel"); } 
     } 
     /// <summary> 
     ///  Initializes a new instance of the MainViewModel class. 
     /// </summary> 
     public MainViewModel(IDataService dataService) 
     { 
      _dataService = dataService; 
      _dataService.GetData(
       (item, error) => 
       { 
        detailsViewModel = new ServerViewModel(item); //ViewModel for the ServerView 
       }); 
     } 
    } 

<igWpf:XamRibbonWindow.Resources> 
    <DataTemplate DataType="{x:Type viewModel:ServerViewModel}"> 
     <views:ServerView /> 
    </DataTemplate> 
</igWpf:XamRibbonWindow.Resources> 

<ContentPresenter Content="{Binding DetailsViewModel}" Grid.Column="1"/> 

Есть другие методы, чтобы сделать MVVM, я просто показываю, как сделать это с подходом вы начали. Проблема с этим подходом заключается в том, что он не будет хорошо масштабироваться для большого количества просмотров в ContentPresenter.

+0

Прежде всего, спасибо за помощь. Пожалуйста, покажите мне, как построить для большого приложения. –

+0

Пожалуйста, взгляните на эти репозитории: https://github.com/firstfloorsoftware/mui и приложения, созданные с использованием этого источника. Руководство по Microsoft для приложений на основе MVPM на WPF находится по адресу https://compositewpf.codeplex.com/. В этом репозитории также есть несколько примеров приложений, которые создаются с использованием лучших практик, которые могут быть использованы для создания крупномасштабных корпоративных приложений. Для compositewpf вы должны найти статьи, описывающие примеры в msdn. – Neeraj

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