2013-03-30 84 views
0

我一直在试图通过使用Panorama.TitleTemplate属性和一个字典绑定数据到它没有任何成功自定义我的全景页面的标题区域。我的XAML代码如下:将数据绑定到Panorama.TitleTemplate

<Grid x:Name="LayoutRoot"> 
    <controls:Panorama Name="siteHubPanoramaControl"> 
     <controls:Panorama.TitleTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal" Height="75" Margin="0,75,0,0" Width="470" DataContext="{Binding}"> 
        <Image Source="{Binding imageSource}" /> 
        <TextBlock Text="{Binding name}" /> 
       </StackPanel> 
      </DataTemplate> 
     </controls:Panorama.TitleTemplate> 

     <!--Panorama item one--> 
     <controls:PanoramaItem Header="Site Info"> 
      <Grid/> 
     </controls:PanoramaItem> 

     <!--Panorama item two--> 
     <controls:PanoramaItem Header="Others"> 
      <Grid/> 
     </controls:PanoramaItem> 
    </controls:Panorama> 
</Grid> 

我用下面的代码字典绑定到数据模板:

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
dictionary.Add("name", this.name); 
dictionary.Add("imageSource", "http://..."); 

siteHubPanoramaControl.DataContext = dictionary; 

我一直在寻找一个解决方案,但没能找到。 如果你能帮助我解决这个问题,我会很高兴。

也有一个很好的资料来了解数据绑定?

在此先感谢...

回答

1

两个nameimageSource不是财产。这只是你的字典中的关键。所以,当你试图绑定这两个名称时,它找不到任何属性。

您必须将这些值公开到属性中。例如,

public string Name 
{ 
    get { return dictionary["name"]; } 
} 

我不确定任何其他方式,但这将是我的想法。它应该工作我认为。

编辑:

好吧,假设你使用的MVVM模式,这下面的代码应该工作。

视图模型

public class MainPageViewModel 
    { 
     private Dictionary<string,string> _dictionary = new Dictionary<string, string>(); 

     public MainPageViewModel() 
     { 
      _dictionary.Add("name", "Foo"); 
      _dictionary.Add("imageSource", "http://"); 
     } 

     public string Name 
     { 
      get { return _dictionary["name"]; } 
     } 

     public string ImageSource 
     { 
      get { return _dictionary["imageSource"]; } 
     } 
    } 

代码隐藏

public partial class MainPage : PhoneApplicationPage 
{ 
    private MainPageViewModel _vm; 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 

     _vm = new MainPageViewModel(); 
     DataContext = _vm; 
    } 
} 

XAML

<Grid x:Name="LayoutRoot"> 
    <phone:Panorama Name="siteHubPanoramaControl"> 
     <phone:Panorama.Title> 
      <StackPanel Orientation="Horizontal"> 
        <Image Source="{Binding ImageSource}"/> 
        <TextBlock Text="{Binding Name}" /> 
       </StackPanel> 
     </phone:Panorama.Title> 
     <!--Panorama item one--> 
     <phone:PanoramaItem Header="Foo"> 
      <Grid/> 
     </phone:PanoramaItem> 

     <!--Panorama item two--> 
     <phone:PanoramaItem Header="Others"> 
      <Grid/> 
     </phone:PanoramaItem> 
    </phone:Panorama> 
</Grid> 

对于XAML,而是采用Panorama.TitleTemplate和应用DataTemplate,使用Panorama.Title代替,这使得它更容易。我试着用TitleTemplate,我只能使它能够绑定标题而不是图像。所以最简单的解决方法是使用Panorama.Title

+0

我宁愿硬编码XAML中的两个项目的值,因为绑定是微不足道的,除非您经常更改您的应用程序标题和图像,或者您将其用于其他目的。 –

+0

该解决方案适用于我。谢谢你的帮助。 –

+1

谢谢Shulhi,对这个问题的很多答案都使用DataTemplate。显然,他们不验证代码的工作原理,因为它不起作用。这是一个完美的解决方案。 – Seamus