Связывание пользовательских элементов управления Datacontext в DataTemplate - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть два пользовательских элемента управления внутри TabItem.TabItem имеет свой собственный ViewModel, у которого есть свойство, к которому привязано содержимое дочернего ContentControl элемента TabItem.Это свойство представляет другую модель представления, которая изменит представление в зависимости от того, какое оно есть.Вот пример:

<TabItem DataContext="{Binding Path=MainLayerTabViewModel, Source={StaticResource ViewModelLocator}}" Header="Layers">
    <ContentControl Content="{Binding ChildViewModel}">
        <ContentControl.Resources>
            <DataTemplate DataType="{x:Type vm:LayersViewModel}">
                <views:LayersTabView DataContext="{Binding ChildViewModel}"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:UserDrawnLayersViewModel}">
                <views:AlternateLayersTabView DataContext="{Binding ChildViewModel}" />
            </DataTemplate>
        </ContentControl.Resources>
    </ContentControl>

Вот модель представления, используемая в качестве текста данных для tabitem:

public class MainLayerTabViewModel : ViewModelBase
{
    public object ChildViewModel { get; set; }

    public MainLayerTabViewModel()
    {
        ChildViewModel = (App.Current.Resources["ViewModelLocator"] as ViewModelLocator).LayersViewModel;
    }
}

Теперь два типа возможных моделей представления для ChildViewModel: LayersViewModel и UserDrawnLayersViewModel.Когда я изменяю ChildViewModel на один из них, вид должным образом переключается через DataTemplate.Но DataContext на самом деле не устанавливается.Ничто не связано.Я попытался создать отдельные свойства для каждой ViewModel в MainLayerTabViewModel и связать DataContext каждого представления с его собственным свойством, но это тоже не сработало.

1 Ответ

0 голосов
/ 14 февраля 2019

Я не проверял это, однако я вижу несколько проблем с вашим кодом.

Вид должен быть

<ContentControl Content="{Binding ChildViewModel}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type vm:LayersViewModel}">
            <views:LayersTabView/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:UserDrawnLayersViewModel}">
            <views:AlternateLayersTabView/>
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>

ViewModel:

public class MainLayerTabViewModel : ViewModelBase
{
    public ViewModelBase ChildViewModel { get; set; }

    public MainLayerTabViewModel()
    {
        ChildViewModel = new LayersViewModel();
        //or ChildViewModel = new UserDrawnLayersViewModel();
    }
}

Надеюсь, это поможет ..

...