/ / One ViewModel dwa widoki z MVVMLight w WPF - c #, wpf, xaml, visual-studio-2015, mvvm-light

Jeden ViewModel dwa widoki z MVVMLight w WPF - c #, wpf, xaml, visual-studio-2015, mvvm-light

Tekst danych jest konfigurowany w App.xaml (z MVVMLight), ale kiedy jest jeden ViewModel jeden widok.

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

Potrzebuję używać tego samego ViewModel z wieloma widokami, dodałem DataContext w codebehind dla każdego widoku (.xaml.cs), ale nie działa.

DataContext = ViewModel.ViewModelLocator.GetStaticVMuserControl;

Muszę dodać DataContext zgodnie z parametrami z app.config. Używam WPF z frameworkiem 4.5.1 ze światłem MVVM z nugetu w VS 2015

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

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

Odpowiedzi:

0 dla odpowiedzi № 1

Widzę kilka potencjalnych powodów, dla których DataTemplate nie działa.

Po pierwsze - prawdopodobnie nie powiązałeś właściwości Content swojego widoku z DataContext (vm: VMUserControl).
2. - używasz niestandardowego szablonu kontroli treści bez ContentPresenter.

Na przykład: App.xaml

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

W twoim widoku

Aktualizacja: W przypadku zdefiniowania dwóch tablic danych dla jednego typu danych (model widoku) dodatkowo powinieneś wdrożyć i używać własnego 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
}
}