Windows Phone 8.1集线器模板项目DataContext绑定

时间:2015-04-09 20:19:48

标签: windows-phone-8.1

这可能是一个愚蠢的问题,但我无法在我自己的Windows Phone应用程序中重新创建“Hub App”模板使用的Hub页面数据绑定方法。

我的XAML绑定到一个viewmodel类,该类被定义为我的Page对象的公共属性,只要我包含该行,它就可以正常工作:

this.DataContext = *viewmodel object here*
在OnNavigatedTo()方法中

如果我注释掉这一行,则在运行时不会加载任何数据。这可能听起来很明显(这是我的问题),“Hub App”模板永远不会在任何.xaml.cs文件中将对象分配给“this.DataContext”。绑定仅在XAML中定义。我错过了什么?

更新:添加了xaml和xaml.cs

XAML

<Page
DataContext="{Binding Subject, RelativeSource={RelativeSource Mode=Self}}"
d:DataContext="{d:DesignData Source=SampleData/SubjectSampleData.xaml}">

XAML.CS

public sealed partial class BlankPage1 : Page
{
    public BlankPage1()
    {
        this.InitializeComponent();
    }

    public Subject Subject { get; set; }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (e.Parameter != null)
        {
            var subjectName = e.Parameter as string;

            var subject = App.MainViewModel.Subjects.Single(item => item.Name == subjectName);

            if (subject != null)
            {
                this.Subject = subject;
            }

            //this.DataContext = this.Subject;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

HubApp 模板定义了xaml中的绑定:

<Page x:Class="App1.HubPage"
<!-- some namespaces -->
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
<!-- rest of code -->

它与你在构造函数中的效果相同:this.DataContext = DefaultViewModel;


编辑 - 评论后

您的情况略有不同 - 您对正常情况具有约束力&#39;没有 INotifyPropertyChanged ICollectionChanged 或其他的属性。查看模板,你会发现 ObservableDictionary 定义了绑定 - 当从这样的distionary中添加/删除项时,它会引发允许更新UI的合适事件。在你的情况下,没有这样的地方。

你的程序是这样的 - 当页面被创建时,你绑定了DataContext,你的属性getter被调用(放在那里Debug.WriteLine("Getter");)但你的属性中还没有任何东西,所以UI是空的。然后很快就会调用 OnNavigatedTo (放在那里Debug.WriteLine("Navigation event");)来填充你的属性,但是没有通知用户界面,所以它没有更新。