Использование базового класса View Model с GalaSoft MVVM Light - PullRequest
0 голосов
/ 16 марта 2012

Я создаю проект с использованием библиотек WPF и MVVM-Light от GalaSoft.У меня будет базовый абстрактный класс View Model, который будет использоваться всеми другими реализованными классами View Model.Там у меня будет базовый класс MVVM-Light.Однако внутри этого базового класса, когда я пытаюсь использовать функцию RaisePropertyChanged, я получаю следующую ошибку:

Требуется ссылка на объект для нестатического поля, метода или свойства GalaSoft.MvvmLight.ViewModelBase.RaisePropertyChanged(строка) '

Код будет выглядеть следующим образом:

AnalysisViewModelBase : ViewModelBase
{
    public const string TagDescriptionStringListPropertyName = "TagDescriptionStringList";

    protected static List<string> m_tagDescriptionStringList;

    public static List<string> TagDescriptionStringList 
    { 
        get 
        { return m_tagDescriptionStringList; }
        set
        {
            if (m_tagDescriptionStringList == value)
                return;

            m_tagDescriptionStringList = value;

            RaisePropertyChanged(TagDescriptionStringListPropertyName);
        }

    }
    protected AnalysisViewModelBase()
    {
        m_tagDescriptionStringList = new List<string>();

        m_tagDescriptionStringList.AddRange(new string[] { "North Position", "East Position", "Depth" });
    }
}

AnotherViewModel : AnalysisViewModelBase
{ ... }

Может ли кто-нибудь помочь мне понять, что не так с моей функцией RaiseProperyChanged?

Ответы [ 2 ]

0 голосов
/ 15 октября 2015

Вы просто должны объявить свое свойство "Tax DescriptionStringList" как нестатическое. Поскольку фоновое поле (m_tagDescriptionStringList) является статическим, оно остается тем же самым. Сделайте это:

class AnalysisViewModelBase : ViewModelBase
{
    public const string TagDescriptionStringListPropertyName = "TagDescriptionStringList";

    protected static List<string> m_tagDescriptionStringList;

    public List<string> TagDescriptionStringList 
    { 
        get 
        { return m_tagDescriptionStringList; }
        set
        {
            if (m_tagDescriptionStringList == value)
                return;

            m_tagDescriptionStringList = value;

            RaisePropertyChanged(TagDescriptionStringListPropertyName);
        }
    }

    protected AnalysisViewModelBase()
    {
        m_tagDescriptionStringList = new List<string>();

        m_tagDescriptionStringList.AddRange(new string[] { "North Position", "East Position", "Depth" });
    }
}

AnotherViewModel : AnalysisViewModelBase
{ ... }

Если в этом случае абсолютно необходимо сохранить свойство как статическое свойство, вот решение: поднять изменения свойства (используя RaisePropertyChanged ("TagDescriptionStringList")), когда это происходит, как я указал в коде ниже

class AnalysisViewModelBase : ViewModelBase
    {
        public const string TagDescriptionStringListPropertyName = "TagDescriptionStringList";

        protected static List<string> m_tagDescriptionStringList;

        public static List<string> TagDescriptionStringList 
        { 
            get 
            { return m_tagDescriptionStringList; }
            set
            {
                if (m_tagDescriptionStringList != value) 
                {  
                    m_tagDescriptionStringList = value;
                }
            }
        }

        protected AnalysisViewModelBase()
        {
            m_tagDescriptionStringList = new List<string>();

            m_tagDescriptionStringList.AddRange(new string[] { "North Position", "East Position", "Depth" });

            RaisePropertyChanged("TagDescriptionStringList");

        }
    }

    AnotherViewModel : AnalysisViewModelBase
    { ... }
0 голосов
/ 16 марта 2012

Вы пытаетесь получить доступ к нестатическому методу из статического метода ... У него нет доступа к этому значению, вы должны сделать свой метод нестатичным.

вот веб-страница, которая объясняет статические методы, если вы хотите лучше понять, почему вы не можете делать то, что пытаетесь сделать.

Ссылка

...