【问题标题】:Using base View Model Class with GalaSoft MVVM Light将基本视图模型类与 GalaSoft MVVM Light 一起使用
【发布时间】:2012-04-02 06:09:36
【问题描述】:

我正在使用 GalaSoft 的 WPF 和 MVVM-Light 库创建一个项目。我将有一个基本的抽象视图模型类,它将被所有其他实现的视图模型类使用。在那里,我将 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 函数出了什么问题?

【问题讨论】:

    标签: mvvm viewmodel mvvm-light


    【解决方案1】:

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

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

    Link

    【讨论】:

      【解决方案2】:

      您只需将您的属性“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
          { ... }
      

      【讨论】:

        猜你喜欢
        • 2011-06-19
        • 2014-10-28
        • 2015-04-25
        • 2013-08-09
        • 1970-01-01
        • 2011-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多