使用带有GalaSoft MVVM Light的基本视图模型类

时间:2012-03-16 17:17:18

标签: mvvm viewmodel mvvm-light

我正在使用GalaSoft的WPF和MVVM-Light库创建一个项目。我将有一个基本的抽象View Model类,它将被所有其他View Model类使用。在那里,我将MVVM-Light基类作为我的基类。但是,在这个基类中,当我尝试使用RaisePropertyChanged函数时,我收到以下错误:

非静态字段,方法或属性'GalaSoft.MvvmLight.ViewModelBase.RaisePropertyChanged(string)'

需要对象引用

代码如下所示:

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 :(得分:0)

您正尝试从静态方法访问非静态方法...它无法访问此值,您必须使方法不是静态的。

这是一个网页,它解释了静态方法,如果你想更好地理解为什么你不能做你想做的事情。

Link

答案 1 :(得分:0)

您只需将您的属性“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”)),正如我在下面的代码中指出的那样< / p>

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
    { ... }
相关问题