一个ViewModel在WPF中使用MVVMLight的两个视图

时间:2017-04-21 18:01:03

标签: c# wpf xaml visual-studio-2015 mvvm-light

datacontext是在App.xaml(使用MVVMLight)中配置的,但是当一个ViewModel是一个View时。

 $('a') 

我需要使用具有倍数视图的相同ViewModel,我在每个视图(.xaml.cs)的代码隐藏中添加了DataContext但不起作用。

<DataTemplate DataType="{x:Type vm:VMUserControl}">
   <views:UCViewSnow />
</DataTemplate>

我需要根据app.config中的参数添加DataContext。 我在WP 2015中使用带有来自nuget的MVVM光的框架4.5.1的WPF

DataContext = ViewModel.ViewModelLocator.GetStaticVMuserControl;

1 个答案:

答案 0 :(得分:0)

我发现DataTemplate无法正常工作的几个潜在原因。

1st - 可能您没有使用DataContext(vm:VMUserControl)绑定视图的Content属性。
第二 - 您使用内容控件的自定义模板而不使用ContentPresenter。

例如: App.xaml中

...
  <Application.Resources>
      <vm:ViewModelLocator x:Key="Locator" />
  </Application.Resources>
...

在您的视图中

<强>更新 如果为一个DataType(viewmodel)定义两个datatemplate 你应该实现并使用自己的ContentTemplateSelector。

<View ...
     DataSource={Binding Source={StaticResource Locator}, Path=YourViewModel}>

    <View.Resource>
        <ResourceDictionar>
               <DataTemplate DataType="{x:Type vm:VMUserControl}" 
                             x:Key="darkDataTemplate"> 
                   <views:UCViewDark /> 
               </DataTemplate>

               <DataTemplate DataType="{x:Type vm:VMUserControl}" 
                             x:Key="snowDataTemplate">
                  <views:UCViewSnow/> 
               </DataTemplate>

              <local:CustomContentTemplateSelector x:Key="yourContentTemplateSelector"
                     FirstDataTemplate={StaticResource snowDataTemplate}
                     SecondDataTemplate={StaticResource darkDataTemplate} />
        </ResourceDictionar>
    </View.Resource>

            <ContentControl Content={Binding} 
                            ContentTemplateSelector={StaticResource yourContentTemplateSelector}/>

CustomContentTemplateSelector.cs

public class CustomContentTemplateSelector:DataTemplateSelector
{
    public DataTemplate FirstDataTemplate {get; set;}
    public DataTemplate SecondDataTemplate {get; set;}

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container){
    // here you should impelement logic for choose data template 
    // if (condition) 
    //      return FirstDataTemplate
    // else
    //      return SecondDataTemplate
}
}
相关问题