В MVVM Navigation будет взята модель из UserControl.DataContext из MainWindow - PullRequest
0 голосов
/ 23 декабря 2019

Я пользуюсь MVVM navigaion. У меня есть главное окно, и я перехожу к дочерним элементам управления. На пользовательских элементах управления я создаю экземпляр их viewmodel. Поэтому мне интересно, какой экземпляр модели представления будет взят, тот, который был создан в главном окне, или один из usercontrol, и это проблематично, что я создаю два экземпляра? Главное окно с DataTemplates:

 <Window.Resources>
        <DataTemplate DataType="{x:Type cust:CustomersListViewModel}">
            <cust:CustomerListView></cust:CustomerListView>
        </DataTemplate>
        <DataTemplate DataType="{x:Type dealer:DealersViewModel}">
            <dealer:DealersView></dealer:DealersView>
        </DataTemplate>
    </Window.Resources>

I Создаю экземпляры дочерних пользовательских элементов управления:

  Customers.CustomersListViewModel customersViewModel = new Customers.CustomersListViewModel();
  Dealers.DealersViewModel dealersViewModel = new Dealers.DealersViewModel();

И я привязываю дочерние пользовательские элементы управления с помощью: `На пользовательских элементах управления я создаю экземпляр viewmodel:

 <UserControl.DataContext>
        <local:CustomersListViewModel></local:CustomersListViewModel>
  </UserControl.DataContext>

Так сложно ли создавать экземпляры модели представления?

Ответы [ 3 ]

0 голосов
/ 23 декабря 2019

Вы должны создать это:

 <Window.Resources>
      <StackPanel>
            <cust:CustomerListView></cust:CustomerListView>
            <dealer:DealersView></dealer:DealersView>
      </StackPanel>
</Window.Resources>

, а в вашем UserControls вы должны сделать это:

  //Create Object of ViewModel in CustomerListView
  DataContext = new Customers.CustomersListViewModel();

  //Create Object of ViewModel in DealersView
  DataContext = new Dealers.DealersViewModel();
0 голосов
/ 24 декабря 2019

Я нашел решение для intellisense, используя d: DataContext = "{d: DesignInstance myApp: Window2ViewModel, IsDesignTimeCreatable = True}"> Так что мне не нужно создавать экземпляр во время выполнения из представления

0 голосов
/ 23 декабря 2019

Вы не должны «создавать интенсификацию модели представления» в коде представления. В любом случае, когда применение DataTemplate путем совпадения с TargetType, DataContext элементов управления DataTemplate будет наследовать значение от шаблонного родителя, потому что TargetType из DataTemplate соответствует Тип экземпляра - этот экземпляр является данным объектом.

Значение DataContext => [Object] => GetType () => Соответствует TargetType => Применить DataTemplate, DataContext is [Object]

Простой пример:

<Window.Resource>
    <DataTemplate TargetType="local:TypeA">
        <TextBlock Text="{Binding ValueA}"/>
    </DataTemplate>
    <DataTemplate TargetType="local:TypeB">
        <TextBlock Text="{Binding ValueB}"/>
    </DataTemplate>
</Window.Resource>
<ContentControl>
    <!-- The content is a TypeA object, will apply the TypeA DataTemplate -->
    <!-- displayed 100 -->
    <local:TypeA ValueA="100"/>
</ContentControl>

И что делает ваш код:

<Window.Resource>
    <DataTemplate TargetType="local:TypeA">
        <TextBlock Text="{Binding ValueA}">
            <TextBlock.DataContext>
                <local:TypeA ValueA="50"/>
            </TextBlock.DataContext>
        </TextBlock>
    </DataTemplate>
</Window.Resource>
<ContentControl>
    <!-- The content is a TypeA object, will apply the TypeA DataTemplate -->
    <!-- displayed 50, because you create a new instance of TypeA in the DataTemplate -->
    <local:TypeA ValueA="100"/>
</ContentControl>
...