在UserControl中绑定DataTemplate

时间:2016-10-10 08:25:14

标签: user-controls uwp datatemplate

我正在写一个UserControl,我打算在几个页面上使用它。它应该将行为封装为对所有页面都相同。但内容和布局应该不同。

在UserControl上我有一个ListView,它将ItemSource绑定到一个启用了分组的​​CollectionViewSource。

<ListView
  ItemSource="{Binding Source={StaticResource Collection}}"
  ItemTemplate="{Binding GroupedDataTemplate}">
  <ListView.GroupStyle>
    <GroupSytele HeaderTemplate="{Binding HeaderDataTemplate}"/>
  </ListView.GroupStyle>
</ListView>

UserControl具有DependencyProperties&#34; GroupedDataTemplate&#34;,&#34; HeaderDataTemplate&#34;对于布局和一个&#34; GroupedCollection&#34;对于数据。

在使用UserControl的页面上,我定义了DataTemplates,如:

<controls:MyUserControl
  GroupedCollection="{Binding DataContext.MyDataCollection, ElementName=thePage}">
  <controls:MyUserControl.GroupedDataTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Description}"/>
    </DataTemplate>
  </controls:MyUserControl.GroupedDataTemplate>
  <controls:MyUserControl.HeaderDataTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Key}"/>
    </DataTemplate>
  </controls:MyUserControl.HeaderDataTemplate>
</controls:MyUserControl>

我的问题是,&#34; GroupedDataTemplate&#34;的DataTemplate定义按预期工作,显示说明。但对于&#34; HeaderDataTemplate&#34;它没有,它只显示ToString() - 对象的表示。

&#34; HeaderDataTemplate&#34;的设置者被调用,DataTemplate被分配给UserControl的DependencyProperty。

如果我用ListView本身替换UserControl,它就像被发现一样工作。因此,绑定适用于Description和Key,但它只适用于描述,如果它在UserControl中。

出于测试目的,我在页面中为Key的绑定添加了一个转换器,它永远不会被调用。在所有情况下,我为ItemTemplate(ListView或GridView)定义了一个DataTemplate,但它不适用于GroupStyle的HeaderTemplate。

我的错是什么?

1 个答案:

答案 0 :(得分:0)

非常好的问题,在您class Movie: NSObject { var movieTitle: String init?(movieTitle: String) { // Initialize stored properties. self.movieTitle = movieTitle super.init() // Initialization should fail if there is no itemName if movieTitle.isEmpty { return nil } } override func isEqual(_ object: Any?) -> Bool { guard let theMovie = (object as? Movie) else { return false } return movieTitle == theMovie.movieTitle } } var movieList = [Movie]() func appendToList(newMovie: Movie) { if (!movieList.contains(newMovie)) { movieList.append(newMovie) } } var movie1 = Movie(movieTitle: "Batman") var movie2 = Movie(movieTitle: "Batman") var movie3 = Movie(movieTitle: "Superman") appendToList(newMovie: movie1!) movieList.count // count is 1 appendToList(newMovie: movie2!) movieList.count // count is still 1 not incremented movieList.contains(movie1!) // Returns true movieList.contains(movie2!) // Returns true movieList.contains(movie3!) // Returns false 的.g.cs文件中使用Binding作为HeaderTemplate的{​​{1}}时,它似乎不是生成GroupSytele的更新代码,这意味着当您定义此UserControl属性时,例如:

HeaderDataTemplate

永远不会调用HeaderDataTemplate

此处的解决方法是,您可以在public static readonly DependencyProperty HeaderDataTemplateProperty = DependencyProperty.Register("HeaderDataTemplate", typeof(DataTemplate), typeof(UserGroupedListView), new PropertyMetadata(null)); public DataTemplate HeaderDataTemplate { get { return (DataTemplate)GetValue(HeaderDataTemplateProperty); } set { SetValue(HeaderDataTemplateProperty, value); } } 中将get更改为Binding

x:Bind

基本上你没有做错任何事,但似乎UserControl <ListView ItemsSource="{Binding Source={StaticResource Collection}}" ItemTemplate="{Binding GroupedDataTemplate}"> <ListView.GroupStyle> <GroupStyle HeaderTemplate="{x:Bind HeaderDataTemplate}" /> </ListView.GroupStyle> </ListView> 的数据绑定只有在使用HeaderTemplate时才有效。