【发布时间】:2013-08-25 09:15:01
【问题描述】:
这是我的 XAML:
<Window x:Class="Test.MainWindow"....
DataContext="{Binding RelativeSource={RelativeSource Self}}"...>
<Window.Resources>
<ResourceDictionary>
<ControlTemplate x:Key="lvTemplate" TargetType="{x:Type ListView}">
<ListView Width="200" ItemsSource="{TemplateBinding ItemsSource}">
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Name"
DisplayMemberBinding="{Binding name}" />
</GridView>
</ListView.View>
</ListView>
</ControlTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid>
<ListView x:Name="lview" Template="{StaticResource lvTemplate }"
ItemsSource="{Binding collection}".../>
<ListView x:Name="lview2" ItemsSource="{Binding collection2}"...>
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Name"
DisplayMemberBinding="{Binding name}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
所以,两个ListView,唯一的区别是第一个是使用模板创建的。
如果我将元素添加到集合中,两个列表中都会出现新行,并且一切正常。但是当我在第一个 ListView (lview) 中选择一行时,没有选择任何项目(仅在视觉上它看起来被选中,在 SelectedIndex == -1,SelectedItem == null 后面的代码中)。还有一件奇怪的事,这个 ListView 的 View 属性为 null。 这里有什么问题?
谢谢你!
【问题讨论】:
-
你为什么要用另一个
ListView来构建ListView的模板,而你在其中更改了View?为什么不简单地更改主要ListView的View?这 2 个网格是独立的,因此它们之间不会传输任何选择或视图 -
我在这里展示了一个简化的代码。在实际应用程序中,大约有十个 TabItem,每个都有一个具有相同 8 列的 ListView。我只是不想让我的 XAML 有几米长,如果我以后必须更改某些内容(例如列名),我只想拥有一次。我选择了可能不是最优雅的方式。我的目的是在某个地方定义所有这些列(我选择了一个模板),然后在我的 ListViews 中引用它。
-
好的,我换个方式问我的问题:如何只定义一次 GridView(或列定义),然后重复使用它?
标签: wpf templates listview selection