gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:57:57 25 4
gpt4 key购买 nike

我想构建一个可以在不同布局中显示数据的 WPF UserControl,基本上是表格、组框和带有选项卡的选项卡控件。我希望控件能够递归地托管自己。例如,我想在其中一个单元格中显示一个带有组框的表格,并在组框内再次显示一个表格布局。

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

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

<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 为空。我可以在代码中创建 GridView 并将其分配给 listView.View 但是我无法访问我想为 GridView 使用 CellTemplateSelector 的 GenericTemplateSelector。

知道为什么 listView.View 为 null 以及我能做些什么吗?

编辑:SledgeHammer 很明显,我想做的是一个糟糕的黑客攻击,但它失败了。正确的方法是将 GenericTemplateSelector 直接传递给附加属性,而不是通过虚拟 GridView 列。

我正在尝试找出一种方法来做到这一点:我的想法是拥有一个具有多重绑定(bind)的附加属性。

<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} 进入多重绑定(bind)吗?

最佳答案

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

关于c# - ListView.View 在 DataTemplate 中使用时为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32060340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com