как запретить пользовательскому элементу управления получать текст данных, когда он скрыт? - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть приложение wpf-mvvm.

У меня есть базовый класс - baseViewModel ...

и два других класса, которые наследуют этот базовый класс

 class aVM : baseViewModel
    {
       public string a {get;set;}
    }

    class bVM : baseViewModel
    {
      public string b {get;set;}
    }

И еще один класс - как основная модель представления - которая привязывается к основному виду.

   Class MainVM
   {
     public baseViewModel CurrentViewSource  {get;set;}
   }

Также в файле XAML (просмотр) - у меня есть два пользовательских элемента управления. Но контекст данных обоих из них является одним и тем же открытым свойством - CurrentViewSource - это тип - baseViewModel.

<---MainView start DataContext="MainVM" ----->

<---user control 1 satrt----->
  <--DataContext = "CurrentViewSource " -->
  // Here CurrentViewSource  is of type aVM
<---user control 1 end ----->

<---user control 2 start----->
  <-- DataContext = "CurrentViewSource " -->
  // Here CurrentViewSource  is of type bVM   
<---user control 2 end----->

<---MainView end----->

Мне нужно отображать один пользовательский элемент управления одновременно, а другой скрывать.

Поскольку оба пользовательских элемента управления (UC) используют одну и ту же переменную контекста данных "CurrentViewSource",

Если UC1 виден (UC2 скрыт) - CurrentViewSource будет иметь тип aVM ... и UC2 (даже скрытый) .. использует это как текстовый текст данных .. и не может видеть строку b.

... Visual Studio показывает некоторые проблемы с привязкой. пожалуйста, помогите мне

1 Ответ

2 голосов
/ 22 февраля 2011

Используйте ContentPresenter в сочетании с неявными шаблонами данных .

Итак, на главном экране, где вы бы показывали тот или иной пользовательский элемент управления, используйте ContentPresenter исвяжите его свойство Content с CurrentViewSource:

<ContentPresenter Content="{Binding CurrentViewSource}"/>

Теперь для каждого поддерживаемого типа модели представления определите DataTemplate в ресурсах вашего основного представления:

<Window ...>
   <Window.Resources>
       <DataTemplate DataType="{x:Type my:aVM}">
          <my:aUserControl/>
       </DataTemplate>

       <DataTemplate DataType="{x:Type my:bVM}">
          <my:bUserControl/>
       </DataTemplate>
   </Window.Resources>
...
   <ContentPresenter Content="{Binding CurrentViewSource}"/>
...
</Window>

Таким образом, при изменении CurrentViewSource будет применяться соответствующий DataTemplate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...