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があります。私がこれをするとき:

2番目=23;

ビュー(テキストボックス)が更新されておらず、_secondの値が表示されません。しかし、テキストボックスに何かを書き込むと、入力した値でモデルが更新されているように見えます。

誰かが私が間違っていることを見ることができますか?

よろしくお願いします、ピーター

4

1 に答える 1

0

あなたの例で与えられたプロパティ名とタイプは少し混乱していますが、あなたの場合の主な問題は次のとおりだと思います。

にタイプのプロパティがありAlarmClockますMainViewModelMainViewModelのインスタンスがありDataContextますMainView.xamlSecondのプロパティをインスタンスに委任しMainViewModelているようです。AlarmClockこれは、変更が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>

もう1つのオプションは、UIへのデリゲート内のAlarmClockインスタンスPropertyChangedイベントをサブスクライブすることですが、それは面倒です。MainViewModelDispatcherTimerを変更して操作することもできますが、MainViewModelそれはそこに属するとは思いません。

于 2012-10-15T10:56:25.427 に答える