• 视图不能由多个 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,只把能共享的留下即可,例如宽度。 

  • 相关阅读:
    有几个控件的操作时有关联关系,一个对话框中有多组这样的控件群,各个组中的控件的消息响应处理非常类似,以下提供解决方案
    Visual Studio DSL 入门 1 什么是特定领域开发和DSL
    ★软件架构DSL领域特定语言初探[
    人生如棋胜似棋
    成功女性处世十大秘诀
    职场丽人应具备十二种经典姿态
    程序员真实写真:35岁前成功的12条黄金法则 (转)
    思雨如思君(七言)
    站在2006的边缘
    不得不学的创业“八忌”
  • 原文地址:https://www.cnblogs.com/liuzhendong/p/3339865.html
Copyright © 2020-2023  润新知