DataTemplate in Resource sets ViewModel to View, b

2019-02-14 14:29发布

问题:

I am trying to figure the many different ways of setting datacontext of a view to a viewmodel.

One I'm oggling at this moment goes something like this:

I have my 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>

But that's also immediately where I strand. I know that I should use a ContentControl in the View. But what is the best way to configure it? How to go about this?

回答1:

That is the way you can enable ViewSwitching navigation in your MVVM application.

The other missing bits are: in the view ->

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

in the ViewModel -> (pseudo code)

Prop ViewModelBase CurrentPage.

note however that if all u want is to connect a ViewModel to a View, you can just drop the entire DataTemplate-ContentControl thing altogether, and just do this.DataContext = new SomeViewModel(); in the codebehind.

The cleanest way I know to connect VM to Views is by using the ViewModelLocator pattern. Google ViewModelLocator.



回答2:

There are a couple of simple ways to just bind a ViewModel to a view. As Elad mentioned you can add it in the code-behind:

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

or, you can specify the ViewModel as a resource in your XAML of your view:

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

and bind the DataContext of your LayoutRoot to that resource:

<Grid x:Name="LayoutRoot" DataContext="{StaticResource ViewModel}">


回答3:

Maybe this doesn't directly answer your question, but have you looked at using an MVVM framework? For example, in Caliburn.Micro you would do (very basic example):

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>

This is a viewmodel first approach.



标签: wpf mvvm binding