2013-10-27 33 views
1

好吧所以我需要做的是使用構造函數初始化ViewModel。問題是由於缺乏知識,我無法創建構造函數。我(一般爲此事或C#)是新來的MVVM,不得不得到一些幫助實現此代碼:缺乏初始化視圖模型的知識

public class ViewModel 
{ 
    private static ViewModel instance = new ViewModel(); 

    public static ViewModel Instance 
    { 
    get 
    { 
     return instance; 
    } 
    } 
} 

不過,我無法創建一個構造函數來把這個代碼。

DataContext = ViewModel.Instance 

這是要進入兩個不同的頁面,以傳遞TextBoxes之間的值。 我也很困惑,想知道我是否應該在主窗口和頁面中或僅在其中一箇中輸入ViewModel

那麼,任何人都可以提供幫助?

回答

0

我基本上遵循這樣的模式:

public class ViewModelWrappers 
    { 
     static MemberViewModel _memberViewModel; 
     public static MemberViewModel MemberViewModel 
     { 
      get 
      { 
       if (_memberViewModel == null) 
        _memberViewModel = new MemberViewModel(Application.Current.Resources["UserName"].ToString()); 

       return _memberViewModel; 
      } 
     } 
... 
} 

要綁定這一個頁面:

DataContext = ViewModelWrappers.MemberViewModel; 

如果我用我只是綁定到頁面上的1個多視圖模型包裝。

DataContext = ViewModelWrappers; 
+0

好吧,我已經在這個充滿的代碼,我只得到一個錯誤,雖然「MemberViewModel是一個屬性,但被使用。像一個類型「它顯示了每個人。知道我錯過了什麼? – Offer

+0

如果我沒有弄錯,DataContext被放在與初始化組件相同的部分是嗎? – Offer

+0

兩件事物具有相同的名稱,更改屬性的名稱。我綁定在頁面的加載事件中。像這樣.Loaded + = MyPage_Loaded; – JBrooks

2

遵循此模式:

這部分是你的模型類應該看起來怎麼樣, 即使您使用實體框架來創建模型,他們繼承INPC ..所以都好。

public class Model_A : INotifyPropertyChanged 
{ 
    // list of properties... 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    // etc... 
} 

每個視圖模型是信息子集來看待,所以你可以有相同的模型類多視圖模型,請注意,如果您撥打電話到無參數的C-TOR你將在視圖模型中使用的模擬模型的自動實例。

public class ViewModel_A1 : INotifyPropertyChanged 
{ 
    public Model_A instance; 

    public ViewModel() 
    { 
    instance = new instance 
    { //your mock value for the properties.. 
     FirstName = "Offer", 
     LastName = "Somthing" 
    }; 
    } 

    public ViewModel(Model_A instance) 
    { 
    this.instance = instance; 
    } 
} 

這是爲了您的觀點,如果您在ide設計器中查看,您將有一個模擬視圖模型來顯示。

public class View_For_ViewModelA1 
{ 
    public View_For_ViewModel_A1() 
    { 
    //this is the generated constructor already implemented by the ide, just add to it: 
    DataContext = new ViewModel_A1(); 

    } 

    public View_For_ViewModel_A1(ViewModel_A1 vm) 
    { 
    DataContext = vm; 
    } 
} 

XAML方:

<Window x:Class="WpfApplication1.View_For_ViewModel_A1" 
    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:ViewModel="clr-namespace:WpfApplication1" 
    mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" 
    d:DataContext="{d:DesignInstance ViewModel:ViewModel_A1, IsDesignTimeCreatable=True}" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <TextBox Text="{Binding FirstName}" /> 
     <TextBox Text="{Binding LastName}" /> 
    </Grid> 
</Window> 

在你希望有一個單一的視圖模型類,涉及多個模型類更高級的場景..但你總是應該設置綁定到一個視圖一個單一的視圖模型。 如果你需要用你的代碼功夫 - 確保你在你的視圖模型層做到這一點。 (即創建一個視圖模型,有幾個不同型號的實例)

注意:這不是mvvm的完整模式。在完整模式中,您可以通過您的模型暴露與模型中的方法相關的命令視圖模型並且可以綁定到您的視圖。 祝你好運:)

+0

好吧,試試看。將很快更新。 – Offer

+0

好吧,我只是擡起頭來看「物業模擬值」,但它似乎可以廣泛不同。我如何找到我的。我在找什麼? – Offer

+0

模擬值是你決定硬編碼或模擬來測試你的視圖模型和視圖..所以我不明白你的意思。 –