Ваши ViewModels не должны заботиться о пользовательских элементах управления. Вместо этого пусть они удерживают ViewModel и позволяют WPF решить, как нарисовать ViewModel с помощью DataTemplate.
Например,
<Window x:Class="test.Views.StartView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:test.Views"
xmlns:viewmodels="clr-namespace:test.ViewModel"
Title="Window1" Height="300" Width="516">
<Window.Resources>
<DataTemplate DataType="{x:Type viewmodels:UCStastistikViewModel}">
<views:UCStastistikView />
</DataTemplate>
</Window.Resources>
<Grid>
<Menu IsMainMenu="True" Margin="0,0,404,239">
<MenuItem Header="_Einstellungen">
<MenuItem Header="Server" />
</MenuItem>
</Menu>
<ContentControl Content="{Binding LoadedControl}" Margin="0,28,0,128" />
</Grid>
</Window>
Кроме того, избавьтесь от <UserControl.DataContext>
в вашем UserControl. DataContext
должен передаваться тем, кто использует элемент управления, не определенный в UserControl:)
Редактировать
Исходя из вашего комментария к более раннему ответу о переключении содержимого StartPage путем переключения ViewModel, вам может быть интересно посмотреть мой пост . Он называется Navigation with MVVM
, однако та же концепция применяется для переключения видов или пользовательских элементов управления
.
По сути, вы бы сделали свойство LoadedControl
типа ViewModelBase
вместо жесткого кодирования его типа, а затем задали бы его для любого объекта, который вы хотите отображать в вашем ContentControl. Шаблоны данных WPF позаботятся о подключении правильного представления для модели представления.