0
<UserControl.DataContext>
    <vm:LightComponentViewModel />
</UserControl.DataContext>

<StackPanel Orientation="Vertical">
    <local:ComponentHeader Content="Light" />
    <StackPanel Margin="5" Orientation="Horizontal">
        <TextBlock Text="Type" />
        <ComboBox SelectedItem="{Binding Type}" ItemsSource="{Binding Source={StaticResource DataProviderLight}}" Width="150" />
    </StackPanel>
    <ContentPresenter Content="{Binding Type}" ContentTemplateSelector="{StaticResource LightComponentsSelector}" />
</StackPanel>

У меня в ContentPresenter подставляется нужный DataTemplate через DataTemplateSelector. В зависимости от выбранного значения в Combobox. Мне нужно в DataTemplate передать текущий DataContext "LightComponentViewModel". Это можно сделать передав в свойство Content ContentPresenter'а инстанс LightComponentViewModel.

Но при этом перестает работать смена DataTemplate при изменении значения Combobox.

Как можно это исправить ?

  • "Как" - Ни как. Вы не должны хотеть этого делать, совсем. 1. DataContext в XAML это по сути, нарушение MVVM, ибо ваш View вдруг знает и даже более, руководит VM слое. 2. Контролы не должны распыляться на множество разных задач, разных видов и так далее. Вот возьмите к примеру TextBox, он знает что либо про данные? Нет. Он лишь что-то делает на основе своего, без вообще каких либо DataContext, ну а все данные ему задаются через свойства (.Text = ...;). Вот такое должно быть и у вас. – EvgeniyZ Jan 22 '24 at 13:30
  • К примеру (вижу у вас ContentPresenter), вы хотите сделать контрол, который будет отвечать за отображение страницы. Создаете его, добавляете свойство зависимости которое принимает простой object, ну или интерфейс страницы, его указываете в ContentPresenter, снаружи в ресурсы добавляете DataTemplate'ы со всеми типами и видами, ну и затем снаружи используете свой контрол как <ns:SuperControl Page = "{Binging CurrentPage}"/>, все, ну и как видите, вообще не трогается DataContext. – EvgeniyZ Jan 22 '24 at 13:34

0 Answers0