我有以下情况。
<GridView ItemsSource={Binding X} ItemsTemplate={StaticResource Y}/>
<TextBlock Text={Binding Z} />
<ListView ItemsSource={Binding K} ItemsTemplate={StaticResource P}/>
现在整个东西需要滚动,因此我可以将它们放在ScrollViewer中,
<ScrollViewer>
<GridView ItemsSource={Binding X} ItemsTemplate={StaticResource Y}/>
<TextBlock Text={Binding Z} />
<ListView ItemsSource={Binding K} ItemsTemplate={StaticResource P}/>
</ScrollViewer>
但是显然这样做会杀死ListView
的虚拟化,所以我没有这样做,而是尝试将GridView
和TextBlock
放在ListViewHeaderItem
内。这样我就可以使用列表视图本身的滚动视图,而无需使用单独的滚动视图,从而使虚拟化生效。
所以,我的问题是我可以将带有其他itemsSource的gridView放在列表的headerItem中吗?到目前为止,由于HeaderItem的数据上下文似乎是listview的ItemsSource的数据上下文,所以我还无法做到。我尝试了以下方法。
<ListView ItemsSource={Binding K} ItemsTemplate={StaticResource P}>
<ListView.HeaderTemplate>
<DataTemplate>
<GridView ItemsSource={Binding X} ItemsTemplate={StaticResource Y}/>
<TextBlock Text={Binding Z} />
</DataTemplate>
</ListView.HeaderTemplate>
</ListView>
感谢您的阅读。
答案 0 :(得分:1)
如果您希望HeaderTemplate内容具有与父列表不同的DataContext,则可以使用ListView.Header属性:
<ListView ItemsSource={Binding K} ItemsTemplate={StaticResource P} Header={Binding HDC}>
<ListView.HeaderTemplate>
<DataTemplate>
<GridView ItemsSource={Binding X} ItemsTemplate={StaticResource Y}/>
<TextBlock Text={Binding Z} />
</DataTemplate>
</ListView.HeaderTemplate>
</ListView>
列表的DataContext如下所示:
public class ListDataContext {
public IEnumerable K {get;}
public HeaderDataContext HDC {get;}
public class HeaderDataContext {
public IEnumerable X {get;}
public string Z {get;}
}
}
答案 1 :(得分:0)
您的代码不是我可以轻松测试的格式,但是通常有两种方法可以做到这一点:
1)给父窗口命名,例如'x:Name = _this',然后将GridView绑定更改为ItemsSource={Binding X, ElementName=_this}
。
2)使用DataProxy(有关代码和说明,请参见this article),然后将GridView绑定更改为ItemsSource={Binding Data.X, Source={StaticResource proxy}}
。
以我的经验,两者都使用WPF,但只有第二个使用Xamarin。我自己不必对UWP进行此操作,但您可能至少会发现其中的一种有效。