我正在写一个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。
我的错是什么?
答案 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
时才有效。