2011-03-31 24 views
4

我正在嘗試將視圖的datacontext設置爲viewmodel的許多不同方法。資源中的DataTemplate將ViewModel設置爲查看,但是然後

一個我在這一刻oggling是這樣的:

我有我的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> 

但是,這也立刻在哪裏鏈。我知道我應該在View中使用ContentControl。但是,配置它的最佳方式是什麼?如何去做這件事?

回答

2

這是您可以在MVVM應用程序中啓用ViewSwitching導航的方式。

另一名失蹤位是: 視圖 - >

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

在視圖模型 - >但是,(僞代碼)

Prop ViewModelBase CurrentPage. 

注意,如果所有的u想要的是連接ViewModel到一個視圖,你可以完全刪除整個DataTemplate-ContentControl的東西,只是做這個。DataContext = new SomeViewModel();在代碼隱藏中。

我知道將VM連接到視圖最清潔的方式是使用ViewModelLocator模式。 Google ViewModelLocator。

+0

你說什麼Content =「{Binding CurrentPage}」,CurrentPage是在我的情況下,然後PersonViewModel,對吧?不過要問,爲什麼要在數據模板中指定ViewModel的時候再次命名ViewModel呢?爲什麼不去內容=「{綁定}」? – 2011-03-31 11:41:53

+0

在DataTemplate中指定的那個是你「捕捉」的那個。這是「目標」。我在綁定中指定的是「源」。但我確實認爲你在這裏看到的是第2步,而不是從一開始就開始。爲了與MVVM一起工作,您應該儘量保持簡單 - 只需使用this.DataContext = new SomeViewModel(); – 2011-03-31 11:46:18

+0

是的,我可能按錯誤的順序做了一些事情,有時候它有點模糊,從哪裏開始。感謝關於ViewModelLocator模式的anser和提示! – 2011-03-31 11:58:26

0

也許這不會直接回答你的問題,但你有沒有看過使用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> 

這是一個視圖模型第一種方法。

+0

是的,這是真的讓我自己找出有關MVVM的各種方法。在我的工作中,我們使用棱鏡,如果我沒有弄錯的話,它也與您所建議的框架一樣。 – 2011-03-31 11:37:36

+0

夠公平的。我會說使用Caliburn.Micro的優勢 - 例如,它的事件聚合器使用起來更容易,並且可以與POCO對象一起使用,並且它還支持基於約定的綁定並且具有非常強大的動作模型。 – devdigital 2011-03-31 12:05:11

1

有幾種簡單的方法可以將ViewModel綁定到視圖。正如埃拉德提到你可以在代碼隱藏添加:

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

,或者你可以指定視圖模型作爲您的視圖的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

+1這是天真的方式,但這是一開始就要走的路。 – 2011-03-31 11:47:40

+0

如何? – 2011-03-31 12:11:51

相關問題