在ViewModel中使用Observable Collection创建DependencyPropery

时间:2016-02-10 23:54:04

标签: c# wpf mvvm

我有WPF应用程序,我正在关注MVVM。我有一个名为Session的类如下: Session.cs

 public class Session:ObservableCollection<Session>
    {
        public int value { get; set; }
        public string name { get; set; }



    }

    public class CustomSession:DependencyObject
    {
        public static readonly DependencyProperty SessionCollectionProperty =
            DependencyProperty.Register("SessionCollection", typeof(Session), typeof(CustomSession), new PropertyMetadata());

        public Session SessionCollection
        {
            get { return (Session)GetValue(SessionCollectionProperty); }
            set { SetValue(SessionCollectionProperty, value); }
        }


    }

我有ViewModel如下: ViewModel.cs

 public class ViewModel:BindableBase
{
    private ObservableCollection<Session> _sessions;
            public ObservableCollection<Session> sessionsCollection
            {
                get { return _sessions; }
                set { SetProperty(ref _sessions, value); }
            }

    public ViewModel()
            {
    sessionsCollection = allSessions();
    }

    public ObservableCollection<Session> allSessions()
            {
                CustomSession custom = new CustomSession();
                custom.SessionCollection.Add(new Session() { name = "LocateSession", value = 10 }); //System.Null Reference Exception.
                custom.SessionCollection.Add(new Session() { name = "TrackSession", value = 20 });
                custom.SessionCollection.Add(new Session() { name = "MonitorSession", value = 25 }); 
                custom.SessionCollection.Add(new Session() { name = "MassSnapshot", value = 18 });
                custom.SessionCollection.Add(new Session() { name = "MassContinuous", value = 9 });
                return custom.SessionCollection;
            }
}

我有一个UI,我想绑定这个Observable Collection。每当我尝试添加一个像这样的项目 custom.SessionCollection.Add(new Session(){name =&#34; LocateSession&#34;,value = 10}); 我得到Null Reference异常。我想从ViewModel填充ObservableCollection。我该怎么做。请帮忙。

3 个答案:

答案 0 :(得分:3)

首先,如果您遵循我将在下面描述(部分)的正确mvvm方法, Null引用异常将会消失

<强> MODEL

以下ObservableCollection强制执行只有您的表示层知道WPF。我接受的例外是Session类型

您的ObservableCollection模型可以使用Sessions属性,但我会称之为CustomSession。 另一方面我认为根本没有理由public class Sessions:ObservableCollection<Session> { public int value { get; set; } public string name { get; set; } } - 尝试将其删除

Sessions

查看模型

它知道您的DependencyObject类型,但它不知道什么是sessionsCollection

在下面的代码中,我经常只将INotifyPropertyChanged属性作为getter。 如果我实现集合,我总是遵循public class ViewModel: BindableBase { private Sessions _sessions; public Sessions sessionsCollection { get { return _sessions; } } public Session SelectedSession { get;set; //properly implemented with the INotifyPropertyChanged } public ViewModel() { sessionsCollection = allSessions(); } public Sessions allSessions() { var custom = new Sessions();//notice this is already a collection custom.Add(new Session() { name = "LocateSession", value = 10 }); //System.Null Reference Exception. custom.Add(new Session() { name = "TrackSession", value = 20 }); custom.Add(new Session() { name = "MonitorSession", value = 25 }); custom.Add(new Session() { name = "MassSnapshot", value = 18 }); custom.Add(new Session() { name = "MassContinuous", value = 9 }); return custom; } } 模式

Sessions

查看

在WPF中,只需将一些组合框,列表框等绑定到<ListBox Items={Binding sessionsCollection} SelectedItem={Binding SelectedSession} /> 属性即可。 我这里没有wpf所以语法可能有误。

.icon {
  height: 8vw;
  width: 8vw;
  background: blue;
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto;
}

我想补充一点,虽然原始问题仅涉及NRE,但它只是因为它将DependencyObject暴露在错误的范围内。我真的相信我的重构有助于理解MVVM的简单性(和优点)

答案 1 :(得分:3)

我不认为没有初始化MasterValue oMV = new MasterValue(); DataTable dt = oMV.GetAll(MasterValueType.ContactMethod); //Now you assign specific field name and field id like below cboContact.DataSource = dt; cboContact.DataTextField = "strText"; cboContact.DataValueField = "intID"; cboContact.DataBind(); 字段会导致空错误。您从未直接使用该字段(或属性)。它只被分配,因此无法导致空例外。

您的问题是您的DependencyProperty _sessions没有默认值。因此,当行SessionCollection SessionCollection custom.被执行时,您会得到一个空异常。 AS .Add(..)将具有null默认值。

尝试像这样更改你的属性(在PropertyMetadata构造函数中给出一个默认值,因为我给了一个新对象(new Session())):

SessionCollection

请参阅下面发生异常的地方:

enter image description here

答案 2 :(得分:-2)

如果您尝试从代码填充此代码(我假设您这样做),问题是您从未初始化_sessions。所以只需进行简单的代码交换:

// old
// private ObservableCollection<Session> _sessions;

// now
private ObservableCollection<Session> _sessions = new ObservableCollection<Session>();

如果你没有初始化_sessions,它将没有引用的对象。这就是NULL引用的含义。如果你试图访问它,你会遇到错误,因为它不知道你指的是哪个对象。

修改

我认为我对这里的不同变量感到困惑。正如评论中所提到的,当您访问不同的属性时,这实际上不能解决问题。但是:一般问题保持不变(访问尚未初始化的集合)。为了解决这个问题,我建议@ Kylo-Ren提出的解决方案