2016-01-20 73 views
0

我试图实现一个中介类ViewModelSelector,它设置并选择当前的View/ViewModel作为主视图主窗口MainView.xaml的一部分显示。我试图通过在MainView.xaml内定义ViewModel1(见下文)的DataTemplate,然后使用我绑定到ViewModelSelector的属性CurrentViewModelContentControl来完成此操作。 ViewModelSelectorViewModel1分配给其属性CurrentViewModel。这个想法是用更多的DataTemplates和ViewModels来扩展它,并使用UserControl来设置ViewModelSelector并决定显示哪个ViewModel(ViewModel1,ViewModel2等)。但由于某些原因,这不起作用:使用MVVM Light的WPF:如何将ContentControl绑定到子属性

使用<ContentControl Content="{Binding ViewModelSelector.CurrentViewModel}"/>将ContentControl绑定到ViewModelSelector.CurrentViewModel时,未显示数据模板(请参见下面的MainView.xaml)。但没有其他错误(我可以告诉)。

为了调试的目的,我还在MainViewModel.cs中创建了CurrentViewModelInMainViewModel属性,我设置为ViewModelSelector.CurrentViewModelCurrentViewModelInMainViewModel = ViewModelSelector.CurrentViewModel;)。直接绑定到它(<ContentControl Content="{Binding CurrentViewModelInMainViewModel}"/>),并显示DataTemplate。

那么我做错了什么?

这里是被忽略的代码。我希望我没有把任何错误的话,因为我在工作中是不是现在并不能测试...

MainViewModel.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ProgramEditor.ViewModel 
{ 
    using GalaSoft.MvvmLight; 
    using ProgramEditor.View; 

    class MainWindowViewModel : ViewModelBase 
    { 
    private ViewModelSelector ViewModelSelector; 
    public ViewModelSelector ViewModelSelector 
    { 
     get { return ViewModelSelector; } 
     set { 
      ViewModelSelector = value; 
      RaisePropertyChanged("ViewModelSelector"); 
     } 
    } 

    private ViewModelBase currentViewModelInMainViewModel; 
    public ViewModelBase CurrentViewModelInMainViewModel 
    { 
     get 
     { 
      return currentViewModelInMainViewModel; 
     } 
     set 
     { 
      if (currentViewModel == value) 
       return; 
      currentViewModelInMainViewModel = value; 
      RaisePropertyChanged("CurrentViewModelInMainViewModel"); 
     } 
    } 

    public MainWindowViewModel() 
    { 
     ViewModelSelector ViewModelSelector = new ViewModelSelector(); 
     CurrentViewModelInMainViewModel = ViewModelSelector.CurrentViewModel; 
    } 
    } 
} 

ViewModelSelector

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ProgramEditor.ViewModel 
{ 
    using GalaSoft.MvvmLight; 

    class ViewModelSelector : ViewModelBase 
    { 
    public ViewModelBase CurrentViewModel 
    { 
     get { return currentViewModel; } 
     set 
     { 
     if (currentViewModel == value) 
      return; 
     currentViewModel = value; 
     RaisePropertyChanged("CurrentViewModel"); 
     } 
    } 
    private ViewModelBase currentViewModel; 

    public ViewModelSelector() 
    { 
     CurrentViewModel = new ViewModel1(); 
    } 
    } 
} 

ViewModel1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ProgramEditor.ViewModel 
{ 
    using GalaSoft.MvvmLight; 

    public class ViewModel1 : ViewModelBase 
    { 
    } 
} 



    <DataTemplate DataType="{x:Type ViewModel:FirstViewModel}"> 
     <TextBlock Text="There be dragons here." FontSize="50"/> 
    </DataTemplate> 

MainView.xaml

<Window x:Class="ProgramEditor.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:view="clr-namespace:ProgramEditor.View" 
    xmlns:ViewModel="clr-namespace:ProgramEditor.ViewModel" 
    Title="MainWindow" Height="900" Width="1600"> 

    <Window.Resources> 
     <DataTemplate DataType="{x:Type ViewModel:ViewModel1}"> 
      <TextBlock Text="There be dragons here." FontSize="50"/> 
     </DataTemplate> 
    </Window.Resources> 

    <StackPanel> 
     <!-- This works (shows up in main window): --> 
     <ContentControl Content="{Binding CurrentViewModelInMainViewModel}"/> 
     <!-- This does not work (does not show up in main window): --> 
     <!--<ContentControl Content="{Binding ViewModelSelector.CurrentViewModel}"/>--> 
    </StackPanel> 
</Window> 
+1

什么是'ViewModelMediator'?什么意思*“不”*起作用?例外?黑屏? – Sinatr

+0

属性路径语法通常起作用。但是,如果你使用不正确,它不会。不幸的是,您只提供了一个不完整的,不可编译的代码示例和一个模糊的,不完整的问题描述。请改善问题。请参阅[mcve]了解有关良好代码示例的信息。 –

+0

好的。我重提了这个问题。我认为这足以自我解释,并假设有人更熟悉WPF会直接发现错误。我希望问题现在更清楚。 – packoman

回答

0

答案是一个微不足道的编程错误。我重写ViewModelSelector财产的MainViewModel.cs这里的构造函数:ViewModelSelector ViewModelSelector = new ViewModelSelector();

改变该行ViewModelSelector = new ViewModelSelector();现在按预期工作后。

+0

我的启示:总是发布完整的代码的另一个原因,因为我没有在问题的原始版本中的片段。 – packoman

相关问题