none
我用了详情页模版,数据绑定(非listview和gridview),界面无显示,求助 RRS feed

  • 问题

  • //XAML我用的详情页模版

    <common:LayoutAwarePage x:Name="pageRoot" x:Class="TestWin8.DetailsPage" DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}" //模版默认的模版数据 IsTabStop="false" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:TestWin8" xmlns:common="using:TestWin8.Common" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Page.Resources> <x:String x:Key="AppName">详情页</x:String> </Page.Resources> <Grid Style="{StaticResource LayoutRootStyle}"> <Grid.RowDefinitions> <RowDefinition Height="140"/> <RowDefinition Height="*"/>

    <RowDefinition Height="auto"/>

    </Grid.RowDefinitions> <!--添加的代码--> //数据绑定开始 <StackPanel Grid.Row="0"> <TextBlock x:Name="Online_update_time" Text="{Binding Path=online_update_time}" Margin="30,0,0,0"/> //数据绑定 <TextBlock x:Name="Type" Text="{Binding Path=type}" Margin="30,0,0,0"/> //数据绑定 <TextBlock x:Name="Director" Text="{Binding Path=director}" Margin="30,0,0,0"/> //数据绑定 </StackPanel> <textblock Grid.Row=1 Text={Binding Path=gut}/>//数据绑定

    <TextBlock x:Name="Actor" Grid.Row=2 Text="{Binding Path=actor}" Margin="30,0,0,0"/> //数据绑定

    </Grid> </common:LayoutAwarePage>

    2,GetData函数取得数据,调试有值。 void DetailsPage::GetData() { String^ strData= commModule->GetResponsString(); JsonValue^ jsonValue = JsonValue::Parse(strData); HomeData^ homeData = ref new HomeData(); homeData->score = jsonValue->GetObject()->GetNamedString("score");//有值 homeData->actor = jsonValue->GetObject()->GetNamedString("actor"); homeData->type = jsonValue->GetObject()->GetNamedString("type"); homeData->director = jsonValue->GetObject()->GetNamedString("director"); homeData->online_update_time = jsonValue->GetObject()->GetNamedString("online_update_time");

    dataBox->ite->Append(homeData); //ite 是数据集合,但是我没用到listview 和 gridview,应该是没用。但是以策安全,我还是加上了。

    //Online_update_time->Text =homeData->online_update_time;//能写的我都写了,只有这样才有效果。 //pageTitle->Text = homeData->title1; //Type->Text = homeData->type; //Director->Text =homeData->director;

    this->DataContext = dataBox; //数据绑定到当前页。 }


    我只有用 t1->Text="**",才能看到数据。

    只绑定binding path 什么都不显示,求助。














    2012年8月28日 2:48

答案

  • 这里你可能没有理解 LayoutAwarePage 的使用方式和他的DefaultViewModel的用法,其实不需要这么复杂的构建自己的ViewModel 然后设置Page 的DataContext上。当然,我先将你现在这样用,是什么原因导致没有显示的,抛开DefaultViewModel不谈。

    首先,我们绑定的源必须是属性,所以type, director要求是属性,你先检查你是否将这些成员定义为了属性。其次,你根本就不需要将你的一个Item加入到你的 dataBox,因为你根本就没有使用ItemsControl等这类列表控件,所以你的集合不会被展开而被TextBlock等直接绑定找到她的里面的一个元素的一个属性。

    纠正方法,你直接将homeData设置到Page的DataContext上。

    或者你在绑定的时候写明详细的dataBox元素索引,索引到你要的那个元素上, 比如 <TextBlock x:Name="Type" Text="{Binding Path=ite[0].type}"  Margin="30,0,0,0"/>  ite为dataBox的属性,然后索引他的第一个元素 [0], 即为你的homeData对象,然后再绑定到她的type属性上。

    -----------------------------------------------------------------

    回过来,讲怎么用LayoutAwarePage 的DefaultViewModel来实现很简单的数据源。你可以在LayoutAwarePage 源代码中看到,DefaultViewModel 是定义为 IObservableMap<String^, Object^>^ 类型的,一个具有通知功能键值对集合。这个类型能够方便的为XAML绑定提供自动更新通知,提供灵活的成员支持。

    我们只需要在其中Insert一个成员,他的Key就是我们要绑定的属性名,他的Value 就是绑定后的实际值。 所以你的代码就可以简单写成:

    void DetailsPage::GetData()
    {
    	String^ strData= commModule->GetResponsString();
    	JsonValue^ jsonValue = JsonValue::Parse(strData);
      DefaultViewModel->Insert("score", jsonValue->GetObject()->GetNamedString("score"));
      DefaultViewModel->Insert("actor", jsonValue->GetObject()->GetNamedString("actor"));
      DefaultViewModel->Insert("type", jsonValue->GetObject()->GetNamedString("type"));
      DefaultViewModel->Insert("director", jsonValue->GetObject()->GetNamedString("director"));
      DefaultViewModel->Insert("online_update_time", jsonValue->GetObject()->GetNamedString("online_update_time"));
    }

    为 DefaultViewModel 添加了依次有 score type actor director 等名字的成员,这些名字在前面绑定的时候直接写在{Binding Path=名字} 这里。就可以实现。

    最后,特别提醒,如果你的绑定的源对象有层次结构,如果你前面并没有ItemsControl这类的列表控件进行默认展开的话,请严格准守层级进行绑定。

    推荐先阅读和学习WPF 的绑定基础,WPF 的绑定涵盖Metro这里的绑定的所有内容,Metro 的绑定比WPF简化了很多,但是基本原理是一致的。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月28日 8:11
    版主

全部回复

  • 这里你可能没有理解 LayoutAwarePage 的使用方式和他的DefaultViewModel的用法,其实不需要这么复杂的构建自己的ViewModel 然后设置Page 的DataContext上。当然,我先将你现在这样用,是什么原因导致没有显示的,抛开DefaultViewModel不谈。

    首先,我们绑定的源必须是属性,所以type, director要求是属性,你先检查你是否将这些成员定义为了属性。其次,你根本就不需要将你的一个Item加入到你的 dataBox,因为你根本就没有使用ItemsControl等这类列表控件,所以你的集合不会被展开而被TextBlock等直接绑定找到她的里面的一个元素的一个属性。

    纠正方法,你直接将homeData设置到Page的DataContext上。

    或者你在绑定的时候写明详细的dataBox元素索引,索引到你要的那个元素上, 比如 <TextBlock x:Name="Type" Text="{Binding Path=ite[0].type}"  Margin="30,0,0,0"/>  ite为dataBox的属性,然后索引他的第一个元素 [0], 即为你的homeData对象,然后再绑定到她的type属性上。

    -----------------------------------------------------------------

    回过来,讲怎么用LayoutAwarePage 的DefaultViewModel来实现很简单的数据源。你可以在LayoutAwarePage 源代码中看到,DefaultViewModel 是定义为 IObservableMap<String^, Object^>^ 类型的,一个具有通知功能键值对集合。这个类型能够方便的为XAML绑定提供自动更新通知,提供灵活的成员支持。

    我们只需要在其中Insert一个成员,他的Key就是我们要绑定的属性名,他的Value 就是绑定后的实际值。 所以你的代码就可以简单写成:

    void DetailsPage::GetData()
    {
    	String^ strData= commModule->GetResponsString();
    	JsonValue^ jsonValue = JsonValue::Parse(strData);
      DefaultViewModel->Insert("score", jsonValue->GetObject()->GetNamedString("score"));
      DefaultViewModel->Insert("actor", jsonValue->GetObject()->GetNamedString("actor"));
      DefaultViewModel->Insert("type", jsonValue->GetObject()->GetNamedString("type"));
      DefaultViewModel->Insert("director", jsonValue->GetObject()->GetNamedString("director"));
      DefaultViewModel->Insert("online_update_time", jsonValue->GetObject()->GetNamedString("online_update_time"));
    }

    为 DefaultViewModel 添加了依次有 score type actor director 等名字的成员,这些名字在前面绑定的时候直接写在{Binding Path=名字} 这里。就可以实现。

    最后,特别提醒,如果你的绑定的源对象有层次结构,如果你前面并没有ItemsControl这类的列表控件进行默认展开的话,请严格准守层级进行绑定。

    推荐先阅读和学习WPF 的绑定基础,WPF 的绑定涵盖Metro这里的绑定的所有内容,Metro 的绑定比WPF简化了很多,但是基本原理是一致的。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月28日 8:11
    版主
  • 3Q,BOB BAO.
    2012年8月28日 13:32