2012-07-20 84 views
0

我正在寫一個Windows Phone應用程序;作爲一名優秀的公民,我正在使用MVVM模式:)由於在MVVM方面不夠專業,我面臨以下問題,希望我能在這裏找到解決方案。如何更改ViewModel屬性的屬性並使更改反映在綁定控件上?

我有以下代碼:

XAML

<Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{Binding MyPOCO}"> 
    <StackPanel> 
     <TextBlock Text="{Binding Name}"/> 
     <TextBlock Text="{Binding IsActive}"/> 
    </StackPanel> 
</Grid> 

代碼隱藏

this.DataContext = new ViewModel(); 

視圖模型

public class ViewModel : ViewModelBase 
{ 
    private POCO myPOCO; 

    public ViewModel() 
    { 
     this.myPOCO = new POCO(); 
     this.ToggleActiveStatusCommand = new RelayCommand(this.ToggleActiveStatus); 
    } 

    public POCO MyPOCO 
    { 
     get 
     { 
      return this.myPOCO; 
     } 
    } 

    public RelayCommand ToggleActiveStatusCommand { get; private set; } 

    private void ToggleActiveStatus() 
    { 
     this.MyPOCO.IsActive = !this.MyPOCO.IsActive; 
     System.Diagnostics.Debug.WriteLine(this.MyPOCO.IsActive); 
     this.RaisePropertyChanged("MyPOCO"); 
    } 
} 

POCO

public class POCO 
{ 
    public string Name { get; set; } 
    public bool IsActive { get; set; } 
} 

我試圖做到的,是改變TextBlock的文本的IsActive變化值......怎麼辦?我的意思是將POCO所需的屬性作爲屬性暴露給ViewModel。

感謝

回答

0

我想你會有,除非你在你的POCO,然後違背MVVM執行INotifyPropertyChanged實現您的視圖模型調用到POCO屬性屬性在您的型號應該牽住你的數據,你的視圖模型是將模型與視圖鏈接起來的膠水。

在您的ViewModel中創建屬性可能看起來像很多額外的工作,但它確實增加了能夠基於單個模型定義許多ViewModel的好處。因此,在特定的ViewModel中,您只會公開您需要的屬性,而不是Model可以提供給您的所有屬性。

定義了ViewModel屬性後,可能需要將Binding模式設置爲TwoWay,以便在底層ViewModel屬性更改時更新UI。

+0

我不能說:重新綁定everthing作爲我的DataContext被改變;就像我在'this.RaisePropertyChanged(「MyPOCO」)中所做的那樣? – TheBlueSky 2012-07-20 11:26:37

+0

如果你爲你的ViewModel實例創建了一個變量,你可以設置你正在做的DataContext,然後進行POCO修改,然後將DataContext設置爲NULL,然後將DataContext設置回你的變量,這會重新綁定,更改。 – 2012-07-20 14:19:36

+0

我並不完全明白。誰將把DataContext設置爲NULL?我無法從ViewModel訪問它,並且我的View代碼不知道是否有更改。如果是WPF,我可能會利用'NotifyOnSourceUpdated',但在WP7中我沒有這種奢侈品......或者我在這裏錯過了什麼? – TheBlueSky 2012-07-20 21:23:51