我有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。我该怎么做。请帮忙。
答案 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
请参阅下面发生异常的地方:
答案 2 :(得分:-2)
如果您尝试从代码填充此代码(我假设您这样做),问题是您从未初始化_sessions
。所以只需进行简单的代码交换:
// old
// private ObservableCollection<Session> _sessions;
// now
private ObservableCollection<Session> _sessions = new ObservableCollection<Session>();
如果你没有初始化_sessions
,它将没有引用的对象。这就是NULL
引用的含义。如果你试图访问它,你会遇到错误,因为它不知道你指的是哪个对象。
修改强>
我认为我对这里的不同变量感到困惑。正如评论中所提到的,当您访问不同的属性时,这实际上不能解决问题。但是:一般问题保持不变(访问尚未初始化的集合)。为了解决这个问题,我建议@ Kylo-Ren提出的解决方案