1

現在、ApplicationBarIconButtons を使用してフォームとのユーザー インタラクションを駆動するビューの検索 (より適切には「フィルター」) フォームを実装しています。 . フィルターを受け入れるテキスト ボックスは、ViewModel のプロパティにバインドされます。

XAML

<toolkit:PhoneTextBox x:Name="txtSearch" Text="{Binding VisitsFilter, Mode=OneWay}" />

ビューモデル

private string _visitsFilter;
public string VisitsFilter
{
    get
    {
        return _visitsFilter;
    }
    set
    {
        _visitsFilter = value;
        RaisePropertyChanged("VisitsFilter");
        RebuildVisits();
    }
}

問題は、ApplicationBarIconButtons がコマンドなどを使用して ViewModel 上のポイントにバインドする機能を実際に持っていないことです。そのため、Click イベントのコード ビハインド ハンドラーでそれらとのやり取りを処理します。それほど大したことではないようです... ページのデータ コンテキストから ViewModel を取得し、バインドされたプロパティの値を設定します。

コードビハインド

private VisitsViewModel ViewModel
{
    get
    {
        return this.DataContext as VisitsViewModel;
    }
}

private void abbClear_Click(object sender, EventArgs e)
{
    this.Focus();
    ViewModel.VisitsFilter = string.Empty;
}

セッターを介して上記のコードをたどると、プライベート文字列メンバーの値を設定し、プロパティが変更されたというイベントを発生させることがわかります。私は実際に、「クリア」ボタンを表示するかどうかについて他のロジックを実行しているビューで、このイベントへのサブスクリプションの背後にあるコードを持っていますが、ポイントはそのイベントで正常にリッスンしていることです。ただし、上記のマークアップの OneWay バインディングは、PhoneTextBox の Text プロパティの値を更新しません。

ここの切断はどこですか?

4

1 に答える 1

1
  1. セッターのメソッドに時間がかかりすぎているか、UI スレッドを台無しにしている可能性があります。つまり、PropertyChanged に応答するためにリリースされるまでに、更新の機会を逃しました...

RebuildVisits(); を削除してみてください。セッターから。それが機能し、この仮定が正しい場合は、別のスレッドで RebuildVisits を実行します。

public string VisitsFilter
{
  get { return _visitsFilter; }
  set { 
         _visitsFilter = value;
         RaisePropertyChanged("VisitsFilter");

         Tasks.StartNew (() => { RebuildVisits();});
       }
    ....

}

2.更新を台無しにしているのが本当に一方向のバインディングである場合。TextBox を設定しない理由

IsReadOnly = "True" で、バインディングを TwoWay に設定します

于 2013-05-31T17:00:03.567 に答える