如果使用模板创建ListView,则为No SelectedItem

时间:2013-08-25 09:15:01

标签: wpf templates listview selection

这是我的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。 这有什么不对?

先谢谢你!

1 个答案:

答案 0 :(得分:1)

如果您希望在更多ListView之间分享视图,可以使用x:Shared="False"创建GridView resoucre:

<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}"/>