DataTemplate в Resource устанавливает ViewModel в View, но затем - PullRequest
4 голосов
/ 31 марта 2011

Я пытаюсь изобразить множество различных способов установки datacontext вида для модели представления.

Один, который я в данный момент повторяю, выглядит примерно так:

У меня есть мойMainWindowResource:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:vw="clr-namespace:DemoStuffPartII.View"
                xmlns:vm="clr-namespace:DemoStuffPartII.ViewModel">

<DataTemplate DataType="{x:Type vm:PersonViewModel}">
    <vw:PersonView />
</DataTemplate>

Но это также, где я прячусь.Я знаю, что я должен использовать ContentControl в представлении.Но как лучше всего это настроить?Как это сделать?

Ответы [ 3 ]

2 голосов
/ 31 марта 2011

Именно так вы можете включить навигацию ViewSwitching в приложении MVVM.

Другие недостающие биты: в представлении ->

<ContentControl Content="{Binding CurrentPage}" />

в ViewModel -> (псевдоcode)

Prop ViewModelBase CurrentPage.

заметьте, однако, что если все, что вам нужно, это подключить ViewModel к представлению, вы можете просто отбросить всю вещь DataTemplate-ContentControl в целом и просто сделать это. DataContext = new SomeViewModel ();в коде позади.

Самый чистый способ, которым я знаю, чтобы подключить VM к Views, это использовать шаблон ViewModelLocator.Google ViewModelLocator.

1 голос
/ 31 марта 2011

Есть несколько простых способов привязать ViewModel к представлению. Как упоминал Elad, вы можете добавить его в коде:

_vm = new MarketIndexVM();
this.DataContext = _vm;

или вы можете указать ViewModel в качестве ресурса в вашем XAML вашего представления:

<UserControl.Resources>
    <local:CashFlowViewModel x:Key="ViewModel"/>
    <Converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</UserControl.Resources>

и привязать DataContext вашего LayoutRoot к этому ресурсу:

<Grid x:Name="LayoutRoot" DataContext="{StaticResource ViewModel}">
0 голосов
/ 31 марта 2011

Возможно, это не дает прямого ответа на ваш вопрос, но рассматривали ли вы использование фреймворка MVVM?Например, в Caliburn.Micro вы должны сделать (очень простой пример):

public class ShellViewModel : Conductor<IScreen>
{
  public ShellViewModel()
  {
    var myViewModel = new MyViewModel();
    this.ActivateItem(myViewModel);
  }
}

ShellView.xaml

<Grid>
  <ContentControl x:Name="ActiveItem" />
</Grid>

MyView.xaml

<Grid>
  <TextBlock>Hello world</TextBlock>
</Grid>

Это первый подход к модели представления.

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