2012-10-15 189 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