绑定有什么问题?

时间:2013-11-30 17:03:46

标签: c# binding

我正在使用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);
}

1 个答案:

答案 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 MainWindowViewModelViewMainPage之间共享。