我正在使用C#和Xaml以及MVVM-Light Toolkit开发Windows 8应用程序。
我将所有内容设置为创建与ObservableCollection
的正确绑定,该get
从本地数据库获取其数据,但它不能正常工作。当我将ObservableCollection
的{{1}}属性编辑为:
get
{
_Subjects.Add(new SubjectViewModel { Name = "Test" });
return _Subjects;
}
显示“测试” - 主题但仍不是数据库中的主题。 然而 - 这里是所有相关的代码:
ViewModelLocator中的注册:
public ViewModelLocator()
{
[...]
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
从数据库中获取数据:
Invokation:
public sealed partial class MainPage : Stundenplaner.Common.LayoutAwarePage
{
MainViewModel mainViewModel = new MainViewModel();
[...]
protected override void OnNavigatedTo(NavigationEventArgs e)
{
mainViewModel.GetSubjects();
base.OnNavigatedTo(e);
}
}
GetSubjects方法和ObservableCollection
public MainViewModel()
{
_Subjects = new ObservableCollection<SubjectViewModel>();
}
public const string SubjectsPropertyName = "Subjects";
private ObservableCollection<SubjectViewModel> _Subjects = null;
public ObservableCollection<SubjectViewModel> Subjects
{
get
{
return _Subjects;
}
set
{
if (_Subjects == value)
{
return;
}
RaisePropertyChanging(SubjectsPropertyName);
_Subjects = value;
RaisePropertyChanged(SubjectsPropertyName);
}
}
public void GetSubjects()
{
using (var db = new SQLite.SQLiteConnection(App.DBPath))
{
var query = db.Table<Subject>().OrderBy(c => c.Name);
foreach (var _subject in query)
{
var subject = new SubjectViewModel()
{
Id = _subject.Id,
Name = _subject.Name
};
_Subjects.Add(subject);
}
}
}
绑定到该集合:
<GridView ItemsSource="{Binding Main.Subjects, Source={StaticResource Locator}}" [...]/>
修改
感谢Rohit Vats,我现在已经解决了这个问题:
创建一个MainViewModel的新实例我已经创建了一个ViewModelLocator实例,它访问MainViewModel的已注册实例,如下所示:
ViewModelLocator Vml = new ViewModelLocator();
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Vml.Main.GetSubjects();
base.OnNavigatedTo(e);
}
答案 0 :(得分:1)
MainWindowViewModel
个实例与您在GUI上看不到数据库数据的原因不同。
GridView
绑定到Main
-
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
ServiceLocator.Current.GetInstance<MainViewModel>();
将返回MainWindowViewModel
的新实例。
在导航的同时,您在MainPage中创建MainWindowViewModel
的全新实例,并在该实例上调用GetSubjects()
。
您应该创建single instance for MainWindowViewModel
,View
和MainPage
之间共享。