加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在DataTemplate中使用时,ListView.View为null

发布时间:2020-12-15 20:54:27 所属栏目:百科 来源:网络整理
导读:我想构建一个 WPF UserControl,它可以显示不同布局的数据,基本上是表格,组框和带有标签的标签控件.我希望控件可以递归地托管自己.例如,我想在其一个单元格中显示一个包含groupbox的表,在组框内再次显示一个表格布局. 为了实现这一点,我使用了TemplateSelecto
我想构建一个 WPF UserControl,它可以显示不同布局的数据,基本上是表格,组框和带有标签的标签控件.我希望控件可以递归地托管自己.例如,我想在其一个单元格中显示一个包含groupbox的表,在组框内再次显示一个表格布局.

为了实现这一点,我使用了TemplateSelector(“GenericLayoutTemplateSelector”)作为xaml中具有不同模板的顶级元素.对于表格布局,我想在代码项目中使用示例“将ListView绑定到数据矩阵”:http://www.codeproject.com/Articles/36462/Binding-a-ListView-to-a-Data-Matrix

codeproject示例工作正常,但是当我在我的上下文中使用它时它会失败.由于我所做的唯一更改是将xaml放在datatemplate / template选择器中,我认为问题可能与此有关.

<DataTemplate x:Key="TableTemplate">
    <Border BorderThickness="2" BorderBrush="SteelBlue">
        <ListView x:Name="TableLayoutListView" tableLayout:ListViewExtension.MatrixSource="{Binding Converter={StaticResource ListToMatrixConverter}}">                    
            <ListView.View>
                <GridView>                           
                    <GridViewColumn DisplayMemberBinding="{Binding Path=[0]}" Header="Dummy" 
                         CellTemplateSelector="{DynamicResource GenericLayoutTemplateSelector}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Border>
</DataTemplate>

它在ListViewExtension.MatrixSource内部检索到GridView时失败:

private static void OnMatrixSourceChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
    ListView listView = d as ListView;
    Matrix matrix = e.NewValue as Matrix;
    listView.ItemsSource = matrix;       
    GridView gridView = listView.View as GridView;
    DataTemplateSelector cellTemplateSelector = gridView.Columns.First().CellTemplateSelector;

listView.View为null.我可以在Code中创建GridView并将其分配给listView.View但是我无法访问GenericTemplateSelector,我想使用CellTemplateSelector作为GridView.

任何想法为什么listView.View是null我能做些什么呢?

编辑:
SledgeHammer明确表示,我正在努力做的是一个糟糕的黑客,它失败了.正确的方法是将GenericTemplateSelector直接传递给附加属性,而不是通过虚拟GridView列.

我想找到一种方法来做到这一点:我的想法是拥有一个带有多重绑定的附加属性.

<DataTemplate x:Key="TableTemplate">
    <Border BorderThickness="2" BorderBrush="SteelBlue">
        <ListView x:Name="TableLayoutListView">
            <tableLayout:ListViewExtension.MatrixSourceWithTemplateSelector>
                <MultiBinding Converter={StaticResource ListToMatrixConverter}>
                    <Binding Path="this" />
                    <Binding {DynamicResource GenericLayoutTemplateSelector}/>
                </MultiBinding>
            </tableLayout:ListViewExtension.MatrixSourceWithTemplateSelector>

但是,这不是有效的xaml.任何想法如何将{DynamicResource GenericLayoutTemplateSelector}纳入多重绑定?

解决方法

我不得不猜测MatrixSource属性是在View属性之前设置的.显然,它们不能同时设置.处理MatrixSource和View更改并调用常用方法并检查null.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读