2011-01-23 54 views
0

我想學習使用Silverlight的MVVM模式。有大量的視頻和博客。我從高層理解它,但似乎無法得到我自己的實現。MVVM和Silverlight的幫助

我得到了以下觀點:

<UserControl x:Class="SilverlightApplication1.MainPage" 
    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:vm="clr-namespace:SilverlightApplication1.ViewModel" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <TextBlock Text="{Binding Name, Mode=TwoWay}" Width="200" Height="200"/> 
     <Button Name="btn1" Width="200" Height="20" Margin="100,268,100,12" Click="btn1_Click"/> 

    </Grid> </UserControl> 

在我的虛擬機,我有: 命名空間SilverlightApplication1.ViewModel

{ 
    public class ViewModel : INotifyPropertyChanged 
    { 
     private Model.UserModel m_model; 

     public ViewModel() 
     { 
      m_model = new Model.UserModel(); 
     } 

     public string Name 
     { 
      get 
      { 
       return m_model.Name; 
      } 
      set 
      { 
       if (value != m_model.Name) 
       { 
        m_model.Name = value; 
        InvokePropertyChanged("Name"); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void InvokePropertyChanged(string propertyName) 
     { 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 

     } 


    } 
} 

,並在我的模型:

namespace SilverlightApplication1.Model 
{ 
    public class UserModel 
    { 
     public string Name { get; set; }  
    } 
} 

基本上,我想模擬一個按鈕點擊並更新屬性,以便它可以觸發正確的ty改變了事件。我試着硬編碼的財產MainPage執行後面的代碼是這樣的:

private void btn1_Click(object sender, RoutedEventArgs e) 
     { 
      ViewModel.ViewModel vm = new ViewModel.ViewModel(); 
      vm.Name = "Test"; 
     } 

不應該這個更新的屬性(對於名稱),提高PropertyChanged事件?我看到其他的例子也做了類似的事情。我不明白什麼是訂閱事件

任何人都可以發光一些嗎?

+0

但事情看起來很正確,但是,您是否設置了斷點_或執行任何故障排除?你的發現是什麼?當你運行應用程序時會發生什麼?除了你的NotifyPropertyChange之外,一切正常嗎? – RyBolt

+0

PropertyChanged事件始終爲空。當我爲該屬性設置斷點時,它會更新,但事件永遠不會上升 – NewGuyIntown

回答

1

在這個例子中,要解決它,試試這個代碼:

private void btn1_Click(object sender, RoutedEventArgs e) 
     { 
      ViewModel.ViewModel vm = new ViewModel.ViewModel(); 
      this.LayoutRoot.DataContext = vm; 
      vm.Name = "Test"; 
     } 

注:我知道你剛開始學習MVVM,但你習慣這種模式後,你應該採取一個框架,這樣就可以專注於MVVM管道之外的事物。在說,在代碼隱藏中做事不是MVVM的方式,比如設置數據上下文。不過,我假設你只是在試驗和學習,所以現在沒問題。

+0

工作正常!爲虛擬機設置layoutroot的數據上下文是做什麼的? – NewGuyIntown

+0

WPF/Silverlight框架需要知道用於數據綁定的數據源。 _data上下文是用於來自MSDN的binding_的數據源。您告訴框架使用您的CLR對象(即您的視圖模型)作爲用於綁定的數據源。 – RyBolt

+0

你能說說你嗎?採用框架?你的意思是像棱鏡?另外,如何以MVVM方式以不同方式做事,而不是在代碼隱藏中設置數據上下文? – NewGuyIntown

0

我想你錯過了這裏是WPF表單的DataContext的設置爲您viewmodel.In XAML中的實例步驟設置你的用戶控件的DataContext到一個新的視圖模型如下圖所示:

<UserControl.DataContext> 
    <vm:ViewModel /> 
</UserControl.DataContext> 

然後就去做正常的設置在你的虛擬機中,它應該讓你的綁定發生變化。

+0

我補充說。 PropertChanged事件仍然爲空。 – NewGuyIntown