我可以在另一个ListView的HeaderItem内添加ListView或GridView吗? [UWP]

时间:2018-07-11 00:16:31

标签: c# listview mvvm uwp uwp-xaml

我有以下情况。

          <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的虚拟化,所以我没有这样做,而是尝试将GridViewTextBlock放在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>

感谢您的阅读。

2 个答案:

答案 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进行此操作,但您可能至少会发现其中的一种有效。