2015-04-16 5 views
0

Я создаю приложение WPF, в котором есть главный экран, на котором загружаются другие экраны.Использовать привязку для изменения usercontrol в сетке

Главный экран можно увидеть как шаблон заголовка/нижнего колонтитула, где центральная часть заменяется в зависимости от того, что мне нужно показать в этот момент. (Это сетка из 3 строк, где usercontrol следует поместить в строку 1). У этого есть viewmodel, который меняет статус заголовка/нижнего колонтитула.

Я реализовал эти изменяющиеся части (строка 1) как usercontrols.

Теперь мне интересно, есть ли способ использовать привязку (к чему-то ..), чтобы я мог изменить загруженный usercontrol и не делать это из кода позади, поскольку я делаю это сейчас.

Если это полностью противоречит принципам MVVM, пожалуйста, дайте мне советы о том, как мне с этим справиться.

Спасибо!

ответ

1

Это звучит так, как будто вы должны смотреть на WPT DataTemplates.

Возьмите этот пример XAML основан на ваш вопрос:

<Grid> 
    ... XAML for your Header and Footer 
    <ContentPresenter Content="{Binding MainContent"> 
     <ContentPresenter.Resources> 
      <DataTemplate DataType="{x:Type viewmodel:UserControlViewModel}"> 
       <view:UserControlView> 
      </DataTemplate> 
     </ContentPresenter.Resources> 
    </ContentPresenter> 
</Grid> 

Здесь я использую ContentPresenter выступать в качестве заполнителя для вашего контента. Это связано с свойством, называемым MainContent, на вашей основной модели. В вашей модели просмотра вы можете установить MainContent как viewmodel для вашего пользовательского контроля.

ContentPresenter попытается отобразить любой объект, к которому он привязан. В этом примере я создал DataTemplate, который сопоставляет конкретный тип объекта (например, UserControlViewModel) с представлением (например, UserControlView).

Вы можете определить несколько DataTemplates, чтобы ваш контент выступающему работать с несколькими ViewModels (или любой тип объекта):

<Grid> 
    ... XAML for your Header and Footer 
    <ContentPresenter Content="{Binding MainContent"> 
     <ContentPresenter.Resources> 
      <DataTemplate DataType="{x:Type viewmodel:UserControlViewModel}"> 
       <view:UserControlView> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodel:AnotherUserControlViewModel}"> 
       <view:AnotherUserControlView> 
      </DataTemplate> 
     </ContentPresenter.Resources> 
    </ContentPresenter> 
</Grid> 

Я надеюсь, что очков вы в правильном направлении.

Вы можете узнать более подробную информацию о Templating данных на MSDN:

https://msdn.microsoft.com/en-us/library/ms742521(v=vs.110).aspx

EDIT: Стоит отметить, что вы МОГ только новый вверх ваш UserControl.xaml в главном ViewModel и установить это свойство MainContent. Там не требуется DataTemplate, поскольку ContentPresenter знает, как представить UserControl. Однако это противоречит MVVM, так как вы тесно связываете свой UI (XAML) с кодом (viewmodel).

+0

Ваш последний момент - это то, с чем я сейчас работаю. Я разработал способ использования «DialogHelper», который создает «CustomDialogView: Window». Содержимое этого диалогового окна может быть одним из трех (или более) 'UserControl'. Поэтому вместо очередности пользовательского элемента управления в ViewModel (как я это делаю сейчас) я мог бы использовать строку и иметь все пользовательские элементы управления в «Window.Resources». Как это звучит? Я просто должен понять, как это сделать. – IAbstract

Смежные вопросы