视图不能由多个 ListView 共享 (View can't be shared by more than one ListView) 的一个解决方法

1.问题的起因

在WPF中遇到一异常,如题。

因此做一个Demo代码来复现问题,代码如下:

<Window x:Class="WpfAppThread.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <Style x:Key="Style1" TargetType="ListView">
                <Setter Property="View">
                    <Setter.Value>
                        <GridView></GridView>
                    </Setter.Value>
                </Setter>
            </Style>
        </Grid.Resources>        
        
        <ListView Name="ListView1" Style="{StaticResource Style1}">            
        </ListView>

        <ListView Name="ListView2" Style="{StaticResource Style1}">
        </ListView>
    </Grid>
</Window>

实质上就是把ListView的View视图定义放到了style中,然后两个ListView都使用了同一个style,结果,不必运行,编辑器就能提示错误:View can't be shared by more than one ListView,如下图:

当然了,实际的程序中我们大多是通过程序创建的ListView并为它指定style的,但报出来的异常和这个简单的Demo是一样的。

 

2.为什么会有这个问题呢?

Msdn上有篇文章(ListView 概述 http://msdn.microsoft.com/zh-cn/library/vstudio/ms750972.aspx )

摘两句如下:"两个 ListView 控件不能同时共用同一个视图模式。如果尝试将同一视图模式用于多个 ListView 控件,则会出现异常。

若要指定可同时由多个 ListView 使用的视图模式,请使用模板或样式。有关如何将视图定义为 Resources 的示例,请参见 ListView with Multiple Views Sample(具有多个视图的 ListView 示例)。"

由此可见,这个异常就是因为两个 ListView 控件不能同时共用同一个视图模式引起的。

 

3.怎么解决呢?

看到有帖子说使用X:Shared="false",试了一下,不行,还是报同样的异常。

其实,试着去掉ListView的View属性及再下级GridView定义,就发现不会引起异常,也就是说,ListView是从ListBox继承而来,如果不用View视图,那用的就仍然是ListBox那一套,而那一套因为相对简单,所以WPF支持,因此运行正常,而一旦使用了View及GridView,因为比较复杂,里面还有可能涉及多个不同子类及对象的创建,所以WPF就不支持了,索性禁止多个ListView共享同一个View视图。

而这样一来,其实解决方法也就有了,既然关闭这扇窗,那就开了另一扇窗,干脆我们就不共享View视图了,让每个ListView都使用自己的View视图就ok了,修改代码如下:

4.总结

把View和GridView从style里挪回到ListView中,就不会再报这个异常了,也就是说,让每个ListView都生成自己独立的View,这就好了,至于style,只把能共享的留下即可,例如宽度。 

posted on 2013-09-25 22:46  BobLiu  阅读(1583)  评论(2编辑  收藏  举报