2011-04-28 164 views
0

並提前感謝您的指導。我是MVVM的新手,我一直在通過文章學習。我想我已經走得很遠了,但有一件事似乎讓我感到難過。我如何(不在代碼中使用代碼)自動綁定到我想要的視圖?據我瞭解,如果做得對,這就是模式應該如何工作。我可以使用主窗口xaml中的代碼來完成這一切,並且我甚至正確創建了一個資源字典(因爲我可以在直接窗口中訪問它)。我無法進入「自動化」的下一步。 「這可能是我的設計,因爲我對這種模式不熟悉,我完全服從我做這一切都是錯誤的可能性。這是我的...MVVM - 我如何將視圖模型綁定到視圖

我有一個主窗口。這是一個3行的網格。第一行是一個菜單。最下面的一行是一個狀態欄。中間是一個堆棧面板,根據菜單選擇動態加載內容。

我有2個視圖用於填充此堆棧面板。一個只有一個樣式文本框(幫助&關於。)另一個本身是一個複合視圖:一個搜索面板,一個結果網格和一個詳細面板全部加載到碼頭管理器框架中。

在後面的主窗口代碼中,當用戶單擊菜單選項時,我清除堆棧面板的子項,實例化視圖模型,實例化將視圖模型傳入其中的視圖,然後將新視圖添加到堆棧的孩子。這工作正常,但我不認爲它符合模式。

正如我所提到的,我有資源字典,但我不知道如何將它與堆棧面板相關聯。我假設我必須使用綁定,但我無法弄清楚如何綁定到資源字典和/或如何告訴它在命令上更改視圖。

我已經閱讀過將所有可用視圖模型添加到視圖模型中的只讀列表的文章,該視圖模型本質上充當主寡婦和實際視圖模型之間的需求。這看起來不錯,但我不明白爲什麼需要資源字典。此外,這些示例是嚮導實現,在這種情況下,這似乎是一個好方法,但我無法想象爲具有100個視圖模型的應用程序執行此操作。

再一次,對我的無知感到抱歉,但我希望有人能指引我走向正確的方向。正如我所說,我讀過很多文章(喬希史密斯,戴夫希爾等),但我仍然沒有建立聯繫,所以我希望得到一些具體的指導。 (我的確有WPF Unleashed的方式,但我希望在此之前取得一些進展。)

任何人都可以幫忙嗎?

+0

沒有足夠的時間來回答這個問題,但也許這會讓你開始。在資源字典中,您可以爲ViewModel類型設置默認視圖。然後,當您將ViewModel的實例放置爲某種ItemPresenter的內容時,它將使用該默認實例並魔術般地顯示ViewModel的正確視圖。然後你所要做的就是創建一個帶有區域的窗口(或者一些這樣的窗口,查看它們)並使用區域管理器填充區域。在這裏看到的問題http://stackoverflow.com/questions/5767759/changing-between-views-using-mvvm-light/5769233#5769233 – 2011-04-28 19:03:23

+0

我想我明白了,但你可以驗證只是爲了確保?資源字典僅僅是關聯特定視圖和視圖模型的捷徑。但儘管如此,無論以何種方式選擇這樣做,您仍然需要在某處說明「何時觸發此事件,清除現有內容並添加此新內容」。是嗎?似乎有更好的方法來處理內容切換,例如您的區域經理。我認爲當我讀到'...沒有代碼後面......'時,我感到困惑。'我認爲這意味着內容切換代碼不存在。 – panania 2011-05-16 17:08:34

回答

0

我沒有使用WPF,但我已經使用Silverlight,我相信它應該幾乎相同。

當我創建我的視圖時,我在視圖中實例化了所需的ViewModel。我使用MEF進行依賴注入並以這種方式創建所需虛擬機,您可能不想沿着這條路線走,但它可以給你一個想法。

例如視圖模型:

[Export] // This attribute tells MEF to export an instance of this class 
public class MyViewModel 
{ ... } 

查看

[Import] // MEF will look for any exported objects of type MyViewModel 
public MyViewModel ViewModel 
{ 
    get { return this.DataContext as MyViewModel; } 
    set { this.DataContext = value; } 
} 

這樣可以節省您的實例VM和你的V,您只需建立V和讓這種關心實例的虛擬機,並設置它自己的DataContext。

+0

對。我做了類似的事情。謝謝,但我的問題更多的是J Trana上面評論的內容。基本上,如何在沒有代碼的情況下切換內容?我想,根據我讀過的內容,你不會。 – panania 2011-05-16 17:12:06

+0

有沒有方法可以在沒有MEF的情況下執行導入/導出操作? – 2011-10-25 07:28:05

+0

@JelleCapenberghs實際的導入/導出屬性是MEF特有的,但你可以使用另一個依賴注入框架,或者編寫你自己的導入/導出屬性來找到適當的類型來實例化 – Fermin 2011-10-25 08:36:37

3

有關如何綁定視圖模型的方法。

1.在XAML中創建一個靜態資源。

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <local:MainViewModel x:Key="MainVM" /> 
    </Window.Resources> 
    <Grid DataContext="{StaticResource MainVM}"> 

    </Grid> 
</Window> 

2.查看的構造

綁定我知道你提到不使用代碼隱藏,但這也是一種選擇。只要你不在代碼背後編寫任何邏輯,那麼你就很好。使用ViewModelLocator

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = new MainViewModel(); 
} 

3.綁定您可能希望創建一個視圖模型定位器類,它是負責給你的觀點,即它需要的視圖模型。

下面是一個viewmodel定位器類的簡單示例。 viewmodel定位器類公開了一些viewmodel屬性。然後,我們將把這些屬性綁定到視圖的數據上下文。

public class ViewModelLocator 
    { 
    public ViewModelLocator() 
    { 
     this.MainVM = new MainViewModel(); 
     this.AnotherVM = new AnotherViewModel(); 
    } 
    public MainViewModel MainVM { get; set; } 
    public AnotherViewModel AnotherVM { get; set; } 
    } 

然後,您可以創建在App.xaml中的視圖模型定位器的靜態資源,使之提供給應用程序內的所有意見。

<Application x:Class="WpfApplication2.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication2" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <local:ViewModelLocator x:Key="Locator" />   
    </Application.Resources> 
</Application> 

然後,您可以將視圖的數據上下文綁定到viewmodel定位器的屬性。

該示例告訴我們,如果將視圖模型定位器(它是MainViewModel實例)綁定到Window的數據上下文,您將綁定MainVM屬性。

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     DataContext="{Binding MainVM, Source={StaticResource Locator}}"> 
相關問題