我想构建一个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}纳入多重绑定的想法吗?
答案 0 :(得分:0)
我必须猜测在View属性之前已经设置了MatrixSource属性。显然,它们不能同时设置。处理MatrixSource和View更改并调用常用方法并检查是否为空。