2012-07-20 85 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