3

INotifyPropertyChanged の目的は何ですか。プロパティが変更されるたびにこのイベントが発生することはわかっていますが、ビュー/UI はこのイベントが発生したことをどのように認識できますか。

INotifyPropertyChanged イベントを実装する Customer クラスは次のとおりです。

public class Customer : INotifyPropertyChanged
    {
        private string _firstName;

        public string LastName { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            if(PropertyChanged != null)
                PropertyChanged(this,new PropertyChangedEventArgs(propertyName));

        }

        public string FirstName
        {
            get { return _firstName; }

            set
            {
                _firstName = value;
                OnPropertyChanged("FirstName");
            }
        }
    }

しかし、プロパティが変更されたことを UI に通知する方法は次のとおりです。ユーザーが最初の名前に null または空を割り当てたときのように、UI に MessageBox を表示するにはどうすればよいですか。

4

3 に答える 3

5

INotifyPropertyChanged により、(標準のデータ バインディング メカニズムを介して) WPF UI 要素が PropertyChanged イベントにサブスクライブし、自動的に更新されるようになります。たとえば、FirstName プロパティを表示する TextBlock がある場合、INotifyPropertyChanged を使用してそれをフォームに表示でき、FirstName プロパティがコードで変更されたときに自動的に最新の状態に維持されます。

ビューはイベントをサブスクライブするだけで、必要なすべての情報が伝えられます。イベントには変更されたプロパティの名前が含まれているため、UI 要素がそのプロパティにバインドされている場合は更新されます。

于 2009-06-24T16:42:48.353 に答える
3

WPF は、オブジェクトがこのインターフェイスを実装しているかどうかを検査し、オブジェクトをそのインターフェイスにキャストしてイベントに登録できるため、知ることができます。その後、Binding Infrastructure をトリガーして表示を更新できます。あなたも反応したい場合は、同じイベントに登録できます。

于 2009-06-24T16:41:55.763 に答える
3

編集:あなたの質問といくつかのコメントを読み直しました。Customer オブジェクトでDataContextChangedイベントと INotifyPropertyChanged インターフェイスを利用した解決策を次に示します。また、WPF および .Net 3.5 でのデータ バインディングの検証も検討する必要があります。

<TextBox Text="{Binding FirstName}" />

// assuming:
// myWindow.DataContext = new Customer();
myWindow.DataContextChanged += MyWindow_DataContextChanged;

private void MyWindow_DataContextChanged(object sender,
    DependencyPropertyChangedEventArgs e)
{
    var oldCustomer = e.OldValue as Customer;
    if (oldCustomer != null)
    {
        oldCustomer.PropertyChanged -= Customer_CheckProps;
    }

    var newCustomer = e.NewValue as Customer;
    if (newCustomer != null)
    {
        newCustomer.PropertyChanged += Customer_CheckProps;
    }
}

private void Customer_CheckProps(object sender, PropertyChangedEventArgs e)
{
    var customer = sender as Customer;
    if (customer != null)
    {
        if (e.PropertyName == "FirstName"
            && String.IsNullOrEmpty(customer.FirstName))
        {
            // Display Message Box
        }
    }
}
于 2009-06-24T16:42:07.650 に答える