这可能是一个愚蠢的问题,但我无法在我自己的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;
}
}
}
答案 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");
)来填充你的属性,但是没有通知用户界面,所以它没有更新。