【问题标题】:No SelectedItem if ListView created using template如果 ListView 使用模板创建,则没有 SelectedItem
【发布时间】: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?为什么不简单地更改主要ListViewView?这 2 个网格是独立的,因此它们之间不会传输任何选择或视图
  • 我在这里展示了一个简化的代码。在实际应用程序中,大约有十个 TabItem,每个都有一个具有相同 8 列的 ListView。我只是不想让我的 XAML 有几米长,如果我以后必须更改某些内容(例如列名),我只想拥有一次。我选择了可​​能不是最优雅的方式。我的目的是在某个地方定义所有这些列(我选择了一个模板),然后在我的 ListViews 中引用它。
  • 好的,我换个方式问我的问题:如何只定义一次 GridView(或列定义),然后重复使用它?

标签: wpf templates listview selection


【解决方案1】:

如果您想在ListView 之间共享视图,您可以使用x:Shared="False" 创建GridView 资源:

<GridView x:Key="gridView" x:Shared="False">
   <GridViewColumn Width="140" Header="Name" DisplayMemberBinding="{Binding name}"  />
</GridView>

然后你可以像下面这样在多个ListView中使用它:

<ListView x:Name="lview" ItemsSource="{Binding collection}" View="{StaticResource gridView}"/>
<ListView x:Name="lview2" ItemsSource="{Binding collection2}" View="{StaticResource gridView}"/>

【讨论】:

  • dkozl,再次感谢您!这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多