DataTemplate未在数据透视窗口手机8.1中加载

时间:2015-03-21 15:38:39

标签: c# windows-phone-8 mvvm windows-phone-8.1

我试图在wp8.1应用程序(UNIAPP)中的透视项目中显示不同的布局。理想情况下,我想加载不同的页面但是因为我可以弄清楚这一点,我想我先尝试使用基础知识,因为我之前使用过这个但是出于某些原因我无法解决这个问题。工作

我的透视图项目是根据提供的ViewModel

动态加载的
 <Pivot.ItemTemplate>
   <DataTemplate>
     <controls:DataTemplateSelector Content="{Binding}"
      HorizontalContentAlignment="Stretch"
      VerticalContentAlignment="Stretch">
    </controls:DataTemplateSelector>
   /DataTemplate>
 </Pivot.ItemTemplate>

我的资源在同一个xaml页面中定义如下

<Page.Resources>
    <DataTemplate x:Key="MyApp.ViewModel.PIDetailsVM">
        <Button Content="test" Foreground="White"></Button>
    </DataTemplate>
    <DataTemplate x:Key="MyApp.ViewModel.PIListVM">
        <Button Content="test" Foreground="White"></Button>
    </DataTemplate>
</Page.Resources>

我的DataTemplateSelector定义如下:

public class DataTemplateSelector : ContentControl
{
  protected override void OnContentChanged(object oldContent, 
  object newContent)
  {
    ContentTemplate = this.FindResource<DataTemplate>(newContent.GetType
    ().FullName);
  }
}

每当我转到新的数据透视表项时都会触发它,但ContentTemplate始终为空。

newContent.GetType().FullName返回相关的viewmodel名称,我可以看到该名称显示在相关的数据透视中。

我注意到的一件事是,当我通过this.Resources.count()检查它时,DataTemplateSelector类(this)没有资源,所以它显然没有找到它们,但我该如何解决这个问题?

更新

我的DataTemplates没有加载到我的Pivot项目中。 .NET IDE显然存在问题,因为每当我在Content =&#34; {Binding}&#34;中添加或删除a时它显示了枢轴项目中的按钮,但是在IDE中。不幸的是,在运行时,它只显示我的viewmodel的名称。

认为IDE中的行为不稳定,当我在使用Content="{Binding<space>"时,我的DataTemplate按钮显示的事实会让你认为代码和xaml是正确的,但它绝对是不在运行时工作。

知道为什么我的DataTemplates没有显示在数据透视表项中的原因是什么?

感谢。

1 个答案:

答案 0 :(得分:0)

这是部分答案。通过这个我的意思是我确实找到了解决问题的方法但我没有自己解决问题。

我的DataTemplateSelector在每次枢轴更改时调用一个名为FindResource的扩展函数时被触发:

public static class ControlExtensions
{
    public static T FindResource<T>(this DependencyObject initial, 
    string key) where T : DependencyObject
    {
        DependencyObject current = initial;

        while (current != null)
        {
            if (current is FrameworkElement)
            {
                if ((current as FrameworkElement).Resources.
                     ContainsKey(key))
                {
                    return (T)(current as FrameworkElement).Resources[key];
                }
            }
            current = VisualTreeHelper.GetParent(current);
        }

        if (Application.Current.Resources.ContainsKey(key))
        {
            return (T)Application.Current.Resources[key];
        }

        return default(T);
    }
}

由于某些奇怪的原因,Windows Phone 8.1(WinRT)不喜欢使用数据模板,而WP8 / WP8.1 Silverlight中不存在问题。

如上所述,这在IDE中有时显示DataTemplate是不稳定的,有时它不会取决于我是否在Binding关键字之后向Content="{Binding}"添加空格。有一点可以肯定的是,它永远不会在运行时工作,至少不是上述代码。

无论如何,

VisualTreeHelper.GetParent(current)始终会返回null。我已经在调试时检查过,如果我能以某种方式访问​​资源,但无济于事。

我是如何解决的?好吧,我将数据模板移动到资源字典

<DataTemplate x:Key="MyApp.ViewModel.PIDetailsVM">
    <Button Content="test" Foreground="White"></Button>
</DataTemplate>

<DataTemplate x:Key="MyApp.ViewModel.PIListVM">
    <Button Content="test" Foreground="White"></Button>
</DataTemplate>

第二个我做了这个,我的FindResources的第二部分开始了,因为Current对象总是为null,无论什么

if (Application.Current.Resources.ContainsKey(key))
  {
    return (T)Application.Current.Resources[key];
  }

并找到相关的DataTemplate并根据相关的PivotItem ViewModel在我的数据透视控件中相应地显示它。

现在,我还没有走出困境,因为我不知道绑定到相关的视图模型是否有效,但这是另一个故事!

如果有人知道为什么在Pages.Resources或Grid.Resources中定义时找不到DataTemplate,请更新帖子,因为我很想知道原因。

感谢。