Наследование от одного базового класса, который реализует INotifyPropertyChanged? - PullRequest
6 голосов
/ 31 января 2012

У меня есть этот BaseClass:

public class BaseViewModel : INotifyPropertyChanged
{
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

и другой класс:

public class SchemaDifferenceViewModel : BaseViewModel
{
    private string firstSchemaToCompare;

    public string FirstSchemaToCompare
    {
        get { return firstSchemaToCompare; }
        set
        {
            firstSchemaToCompare = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("FirstSchemaToCompare"));
                //StartCommand.RaiseCanExecuteChanged();
            }
        }
    }

PropertyChanged здесь (2Times), подчеркнут красным, он говорит:

Error   1   The event BaseViewModel.PropertyChanged' can only appear on the left hand side of += or -= (except when used from within the type 'SchemaDifferenceFinder.ViewModel.BaseViewModel')

Что я делаю не так?Я переместил PropertyChangedEvent только в новый класс: BaseViewModel ..

Ответы [ 3 ]

6 голосов
/ 31 января 2012

Вы не можете вызвать событие вне класса, в котором оно объявлено, используйте метод в базовом классе для его вызова (make OnPropertyChanged protected).

3 голосов
/ 31 января 2012

Изменить производный класс следующим образом:

public class SchemaDifferenceViewModel : BaseViewModel
{
    private string firstSchemaToCompare;

    public string FirstSchemaToCompare
    {
        get { return firstSchemaToCompare; }
        set
        {
            firstSchemaToCompare = value;
            OnPropertyChanged("FirstSchemaToCompare");
        }
    }
0 голосов
/ 31 января 2012

Создание базового класса для INPC - плохой дизайн, на мой взгляд.

Это учебник, где вы можете использовать mixin

Короче говоря, он позволяет вам предоставлять реализацию по умолчанию для членов интерфейса. Вы все равно сможете наследовать от действительно интересного класса =)

...