【发布时间】:2015-11-03 19:00:58
【问题描述】:
所以我的情况是这样的:我希望能够将 MVVM 与使用 MongoDB 的 WPF 应用程序一起使用。我对 MVVM 很陌生(我对此知之甚少),但我有一些使用 .NET 和 WPF 的经验。
我有一个用于调用 MongoDB 集合的命名空间,其中 Model 组件存储为一个名为“User”的类
模型(在单独的命名空间中):
public class User
{
[BsonElement("_id")]
public ObjectId Id { get; set; }
public string name { get; set; }
// other methods listed here
public async static Task<List<User>> getUserList()
{
// allows me to get a list of users
var col = MongoDBServer<User>.openMongoDB("Users");
var filter = Builders<User>.Filter.Exists("name");
List<User> userList = await col.Find(filter).ToListAsync();
return userList;
}
}
我已经创建了一个非常基本的 ViewModelBase(抽象 ViewModelBase):
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if(handler == null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
}
还有一个用于处理用户列表(ViewModel)的派生类:
public class UserListViewModel : ViewModelBase
{
private User _user;
private ObservableCollection<User> _userList;
public User user
{
get { return _user; }
set
{
_user = value;
OnPropertyChanged("user");
}
}
public ObservableCollection<User> userList
{
get { return _userList; }
set
{
_userList = value;
OnPropertyChanged("userList");
}
}
public UserListViewModel()
{
user = new User();
this.userList = new ObservableCollection<User>();
// since MongoDB operations are asyncrhonous, the async method "getUserList()" is used to fill the observable collection
getUserList().Wait();
}
public async Task getUserList()
{
var UserListRaw = await User.getUserList();
this.userList = new ObservableCollection<User>(UserListRaw);
}
}
视图组件是一个带有列表框的简单窗口,如下(视图):
<Window x:Class="UserManagementMVVM.UsersWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:UserManagementMVVM"
mc:Ignorable="d"
Title="UsersWindow" Height="300" Width="300">
<Window.Resources>
<local:UserListViewModel x:Key="ViewModel"/>
<!-- Receiving error for this XAML block saying "Object reference not set to instance of an object -->
</Window.Resources>
<Grid DataContext="{Binding ViewModel}">
<ListBox Margin="5" ItemsSource="{Binding userList}"/>
</Grid>
</Window>
App.Xaml 及其代码隐藏保持不变,视图的代码隐藏也是如此。
当我运行程序时,什么都没有显示(即:窗口启动,但列表框是空的,即使有数据)。我将很快添加一些按钮功能,这些功能将使用 MongoDB 执行原子操作。
我已经尝试了将近 2 周来为此制作自己的 MVVM 程序,但没有成功。任何帮助将不胜感激。
【问题讨论】:
-
你的 userList 是否包含数据?
-
是的。这是我从 MongoDB 调用的具有数据的“用户”列表。它由 ViewModel 中的“getUserList()”函数填充。
-
你试过...调试吗? “什么都没有显示”并不是足够的信息。
-
是的,我的意思是你看到它在调试器中填充了吗?
-
Will -- 我应该从哪里开始调试? “什么都没有出现”是指程序启动时 ListBox 是空的。抱歉没有详细说明。