【问题标题】:Windows Phone 8.1 Hub Template Project DataContext BindingWindows Phone 8.1 Hub 模板项目 DataContext 绑定
【发布时间】:2015-04-09 20:19:48
【问题描述】:

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

我的 XAML 绑定到一个视图模型类,该类被定义为我的 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;
        }
    }
}

【问题讨论】:

    标签: windows-phone-8.1


    【解决方案1】:

    HubApp 模板在 xaml 中定义绑定:

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

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


    编辑 - 在 cmets 之后

    您的情况略有不同 - 您绑定到没有 INotifyPropertyChangedICollectionChanged 或其他的“普通”属性。查看模板,您会发现那里的绑定定义为 ObservableDictionary - 当从此类字典中添加/删除项目时,它会引发合适的事件,允许更新 UI。在你的情况下没有这样的地方。

    你的程序是这样工作的——当页面被创建时,你已经绑定了 DataContext,你的属性 getter 被调用(放在那里Debug.WriteLine("Getter");)但是你的属性中还没有任何东西,所以 UI 是空的。然后稍后会调用 OnNavigatedTo(放在那里 Debug.WriteLine("Navigation event");)来填充您的属性,但 UI 没有收到通知,因此没有更新。

    【讨论】:

    • 感谢您的回复,我遇到的问题是这正是我的 XAML 正在做的事情,我的 Page 类上有一个公共属性,我正在以相同的方式设置,但我得到了如果 xaml.cs 中没有 this.DataContext 分配,则不会在运行时加载数据。
    • @Apogee 能否提供一个有问题的样本?
    • @Apogee 现在情况更清楚了 - 请看看我的编辑。
    • 很好的答案 Romasz,现在对我来说很有意义。我将继续实现该接口,看看它是否有效。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2014-05-19
    相关资源
    最近更新 更多