2012-10-15 232 views
1

我正在做一個WP7應用程序的第一次,我試圖使用MVVM模式。 我想提出一個鬧鐘,這就是我:Windows Phone 7應用程序 - INPC問題

視圖 - MainView.xaml

... 
<TextBox Text="{Binding Hour, Mode=TwoWay}"></TextBox> 
... 

型號 - AlarmClock.cs:

... 

private string _second = 22; 
    public string Second { 
     get { return _second; } 
     set { 
      _second = value; 
      OnPropertyChanged("Second"); 
     } 
    } 
... 

視圖模型 - MainViewModel.cs

... 
private AlarmClock alarmClock; 

public MainViewModel() { 
    alarmClock = new AlarmClock(); 
} 

public string Second { 
     get { return alarmClock.Second; } 
     set { 
      alarmClock.Second = value; 
      OnPropertyChanged("Second"); 
     } 
    } 

在MainView.xaml.cs中,我將數據上下文設置爲 t his.DataContext = new ViewModel();

ViewModel和Model都實現了INotifyPropertyChanged接口。

而我的問題是:在模型中我有一個DispatcherTimer每秒鐘滴答滴答。當我這樣做:

第二= 23;

我的視圖(我的文本框)沒有更新,也沒有顯示_second的值。但是,如果我在文本框中寫入某些內容,那麼似乎我的模型會更新爲鍵入的值。

有人可以看到我做錯了什麼嗎?

謝謝你在前進, 彼得

回答

0

在你的例子給出的屬性名稱和類型都有點混亂,但我覺得你的情況的主要問題是:

你有一個屬性在MainViewModel中輸入AlarmClockMainView.xamlDataContextMainViewModel實例。我看到您將MainViewModelSecond屬性委託給AlarmClock實例。如果更改來自UI,這很好,但我認爲DispatcherTimer在AlarmClock實例上運行,但該實例沒有任何觀察者(因爲UI監聽MainViewModel實例)。

您有多個選項可以使其工作,但我對這種情況的建議是擴展TextBox綁定路徑並將其直接綁定到AlarmClock實例。當然,你需要暴露AlarmClockMainViewModel

private AlarmClock alarmClock; 

public MainViewModel() { 
    alarmClock = new AlarmClock(); 
} 

public AlarmClock AlarmClock 
{ 
    get { return alarmClock; } 
} 

然後改變你的XAML:

<TextBox Text="{Binding AlarmClock.Hour, Mode=TwoWay}"></TextBox> 

另一種選擇是訂閱AlarmClock實例PropertyChangedMainViewModel內部事件的委託,它的用戶界面,但這是混亂。您也可以將DispatcherTimer更改爲MainViewModel,但我不認爲它屬於那裏。

+0

再次感謝您的回覆。有效 :) – Peter