1

我第一次做一个 WP7 应用程序,我正在尝试使用 MVVM 模式。我正在制作一个闹钟,这就是我所拥有的:

视图 - 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");
        }
    }
...

ViewModel - 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 我将数据上下文设置为 this.DataContext = new ViewModel();

ViewModel 和 Model 都实现了 INotifyPropertyChanged 接口。

我的问题是:在模型中,我有一个每秒滴答的 DispatcherTimer。当我这样做时:

第二 = 23;

我的视图(我的文本框)没有更新,也没有显示 _second 的值。但是如果我在文本框中写了一些东西,那么我的模型似乎是用输入的值更新的。

有人可以看到我做错了什么吗?

提前谢谢你,彼得

4

1 回答 1

0

您的示例中给出的属性名称和类型有点令人困惑,但我认为您的主要问题如下:

你有一个类型AlarmClock在你的MainViewModel. 您有一个MainViewModel实例DataContext作为MainView.xaml. 我看到您将 的Second属性委托MainViewModelAlarmClock实例。当更改来自 UI 时这很好,但我认为您的 DispatcherTimer 在AlarmClock实例上运行但该实例没有任何观察者(因为 UI 侦听MainViewModel实例)。

您有多个选项可以使其工作,但我对这种情况的建议是扩展 TextBox 绑定路径并将其直接绑定到AlarmClock实例。当然,您需要在以下AlarmClock位置公开MainViewModel

private AlarmClock alarmClock;

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

public AlarmClock AlarmClock 
{
    get { return alarmClock; }
}

然后更改您的 xaml:

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

另一种选择是订阅UI 委托中的AlarmClock实例PropertyChanged事件,但这很麻烦。MainViewModel您也可以更改 DispatcherTimer 以对其进行操作,MainViewModel但我认为它不属于那里。

于 2012-10-15T10:56:25.427 回答