【问题标题】:Error: System.NullReferenceException: Object reference not set to an instance of an object [duplicate]错误:System.NullReferenceException:对象引用未设置为对象的实例[重复]
【发布时间】:2013-12-15 00:44:39
【问题描述】:

使用 Windows 手机应用程序 C#:

添加信息时出现此错误“System.NullReferenceException:对象引用未设置为对象的实例。” tại "Data.Add(newInfo) " 我使用 MVVM 模式。

MainViewModel.cs中,我的Add Function

public class MainViewModel : INotifyPropertyChanged
{
    private MemberDataContext MemberDB;

    public MainViewModel(string MemberDBConnectionString)
    {
        MemberDB = new MemberDataContext(MemberDBConnectionString);
    }


    private ObservableCollection<Member> _data;
    public ObservableCollection<Member> Data
    {
        get { return _data; }
        set
        {
            _data = value;
            NotifyPropertyChanged("Data");
        }
    }

    public void LoadCollectionsFromDatabase()
    {
        var infoInDB = from Member ss in MemberDB.Members
                       select ss;
        Data = new ObservableCollection<Member>(infoInDB);
    }


    public void Addinfo(Member newInfo)
    {
        MemberDB.Members.InsertOnSubmit(newInfo);

        MemberDB.SubmitChanges();
        Data.Add(newInfo); **<~~~~~~~ Error in this line**

    }

    public void Update(Member currentmember, string fullname, string address)
    {
        currentmember.Address = address;
        currentmember.FullName = fullname;
    }

    public void Delete(Member currentmember)
    {
        MemberDB.Members.DeleteOnSubmit(currentmember);
        Data.Remove(currentmember);
    }

    public void SaveData()
    {
        MemberDB.SubmitChanges();
    }

    public void LoadData()
    {
        if (Data == null)
        {
            Data = new ObservableCollection<Member>(MemberDB.Members);
            var oderedFullName = from Member b in MemberDB.Members
                                 orderby b.FullName
                                 select b;
        }
    }

    public MainViewModel()
    {
        MemberDB = new MemberDataContext("Data source=isostore:/Member.sdf");
        if (!MemberDB.DatabaseExists())
        {
            MemberDB.CreateDatabase();
        }
    }



    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    // Used to notify the app that a property has changed.
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion

}
public class ViewDetails : INotifyPropertyChanged
{
    private string _fullname;

    public string FullName
    {
        get
        {
            return _fullname;
        }
        set
        {
            _fullname = value;

            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Fullname"));
            }
        }
    }

    private string _address;

    public string Address
    {
        get
        {
            return _address;
        }
        set
        {
            _address = value;

            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Address"));
            }
        }
    }
    public void LoadDetails(Member abc)
    {
        FullName = abc.FullName;
        Address = abc.Address;
    }
    public void UpdateDetails(Member abc)
    {
        abc.FullName = FullName;
        abc.Address = Address;
    }
     #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    // Used to notify the app that a property has changed.
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion

我的Add.xaml:

<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

        <TextBlock Text="FullName"/>
        <TextBox x:Name="addfullname"/>
        <TextBlock Text="Address"/>
        <TextBox x:Name="addaddress" />


    </StackPanel>

我的添加按钮:

 private void Add_Click(object sender, EventArgs e)
    {
        if ((addaddress.Text.Length > 0) && (addfullname.Text.Length > 0))
        {
            Member newInfo = new Member
            {
                FullName = addfullname.Text,
                Address = addaddress.Text
            };
            App.MainViewModel.Add(newInfo);

            if (NavigationService.CanGoBack)
            {
                NavigationService.GoBack();
            }
        }
        //else MessageBox.Show("Data cannot be null!");

    }

在我的 App.xaml

  public partial class App : Application
{
    private static object _lockObject = new object();
    private static MainViewModel mainviewmodel;
    public static MainViewModel MainViewModel
    {
        get
        {


            if (mainviewmodel == null)
            {
              lock (_lockObject)
              {
                  mainviewmodel = new MainViewModel();
                }
            }
            return mainviewmodel;
        }


    }

【问题讨论】:

  • 使用调试器可以帮助您快速确定问题。
  • PropertyChanged 值始终为 Null :( 我不知道为什么

标签: c# mvvm windows-phone


【解决方案1】:

您没有使用 new 关键字实例化您的 MainViewModel

 private static MainViewModel mainviewmodel;
        public static MainViewModel MainViewModel
        {
            get
            {
          mainviewmodel = new  MainViewModel();
                return    mainviewmodel;
            }
        }

更新

这一行应该是这样的

private ObservableCollection<Member> _data = new ObservableCollection<Member>(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多