wpf, переплет и datacontext - PullRequest
       2

wpf, переплет и datacontext

0 голосов
/ 14 декабря 2010

Это моя ViewModel -

 public class ViewModel 
{
    public ObservableCollection<Person> Persons { get; set; }
}

, а это Class Person:

public class Person : INotifyPropertyChanged
{
    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Теперь, каждый раз, когда имя одного из людей меняется, я хочу выполнить некоторые задачискажем, поднять окно сообщения.

Как мне это сделать?

Ответы [ 3 ]

1 голос
/ 14 декабря 2010

Вам нужно реализовать INotifyPropertyChanged

public class Person : INotifyPropertyChanged
{
    private string firstName;
    public string FirstName 
    { 
       get { return this.firstName;} 
       set 
       { 
          this.firstName = value;
          this.RaisePropertyChanged("FirstName");
          MessageBox.Show("Hello World");
       }
    }
}

public event PropertyChangedEventHandler PropertyChanged;

protected void RaisePropertyChanged(string propertyName)
{
     PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
     if ((propertyChanged != null))
     {
         propertyChanged(this, new PropertyChangedEventArgs(propertyName));
     }
}
1 голос
/ 14 декабря 2010

Обычно ваш класс person будет использовать интерфейс INotifyPropertyChanged, вызывая событие PropertyChanged при каждом изменении FirstName.Это позволяет вам связывать элементы в представлении с вашим классом Person, и представление будет обновляться при изменении данных.

Чтобы вывести окно сообщения, когда любое FirstName, однако, вам понадобится некоторый код позади в вашем представлении.Один из способов сделать это состоит в том, чтобы, как и прежде, использовать измененный INotifyProperty и подписаться на него для всех объектов Person в вашем представлении, используя MessageBox. Показывать всякий раз, когда вызывается событие, изменяющее FirstName.Вы можете использовать событие CollectionChanged в ObservableCollection для отслеживания объектов Person в и из списка, чтобы убедиться, что они все связаны с вашим обработчиком измененных событий Person FirstName.

Лучший способ сделать это, по моемумнение, это иметь событие в ViewModel, а не в классе Person, которое срабатывает всякий раз, когда вносится изменение в любой класс Person (с конкретным объектом Person в качестве аргумента).Это будет работать только в том случае, если ViewModel - единственное, что может изменить Person.FirstName, и вашему представлению придется привязаться к ViewModel соответствующим образом, чтобы добиться этого.

0 голосов
/ 14 декабря 2010

Вам необходимо реализовать INotifyPropertyChanged в вашей модели представления и вызвать событие свойства изменено при настройке коллекции лиц.Это позволит вам прослушать тот факт, что он изменился.

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

...