1

Windowsストアアプリを構築していて、TextBoxをTaskItemオブジェクトの文字列「title」プロパティにバインド(双方向モード)しています。

UIの変更がこのTextBoxに加えられ、ソースに伝播された後、いくつかの処理を行う必要があります。

ターゲット(TextBoxのTextプロパティ)がいつ変更されたかを検出する方法があるかどうか知りたいのですが。TextBoxのLostFocusイベントを処理することでこのイベントをキャッチできることはわかっていますが、このイベントはソースが更新される前にトリガーされます。

アップデート:

バインディング:

<ScrollViewer
            x:Name="itemDetail"
            DataContext="{Binding SelectedItem, ElementName=itemListView}">
    <TextBox x:Name="itemTitle" Text="{Binding Title, Mode=TwoWay}"/>
</ScrollViewer>

クラスとプロパティ:

class TaskItem
{
    public string Title { get; set; }
}

ソースからターゲットに変更を伝播する必要がないため、INotifyPropertyChangedを実装しませんでした。

私は2つの解決策を考えることができます:

  • プロパティのセッターで[CallerMemberName]を使用する方法はありますか?ある場合は、「タイトル」が自分のコードによって変更されたのか、バインディングが原因で変更されたのかを判断できる場合があります。
  • LostFocusイベント中に双方向バインディングを破棄し、ソースを手動で更新します。
4

1 に答える 1

1
class TaskItem, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    internal void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private string title;
    public string Title 
    { 
       get { return title; } 
       set 
       { 
           if (title == value) return;
           title = value;
           NotifyPropertyChanged("Title");
       }
    }
    public TaskItem (string -title) 
    { title = _title; }  
    // does not fire setter title lower case 
    // but the UI will have this value as ctor fires before render 
    // so get will reference the assigned value of title 
}

コンストラクターの設計

于 2012-09-30T20:04:48.267 に答える