我想创建一个WPF UserControl,可以以不同的布局方式显示数据,基本上包括表格、GroupBox和带选项卡的TabControl。我希望该控件能够递归地托管自身。例如,我希望在其中一个单元格中显示一个GroupBox的表格,并在GroupBox内部再次使用表格布局。
为了实现这一点,我在XAML中使用了一个名为“GenericLayoutTemplateSelector”的模板选择器(TemplateSelector)作为顶级元素,并使用了不同的模板。对于表格布局,我希望使用Code Project上的示例“Binding a ListView to a Data Matrix”: http://www.codeproject.com/Articles/36462/Binding-a-ListView-to-a-Data-Matrix Code Project的示例很好用,但是当我将其用于我的上下文时,它失败了。由于我所做的唯一更改是将XAML放置在DataTemplate/TemplateSelector中,因此问题可能与此相关。
有任何想法为什么listView.View为空以及我该怎么做?
编辑: SledgeHammer明确指出,我试图做的是一个糟糕的hack,它失败了。正确的方法是直接将GenericTemplateSelector传递给附加属性,而不是通过虚拟的GridView列。
我正在尝试找出一种使用多绑定的附加属性的方法。
然而,这不是有效的XAML。有什么想法可以将{DynamicResource GenericLayoutTemplateSelector}添加到多绑定中吗?
为了实现这一点,我在XAML中使用了一个名为“GenericLayoutTemplateSelector”的模板选择器(TemplateSelector)作为顶级元素,并使用了不同的模板。对于表格布局,我希望使用Code Project上的示例“Binding a ListView to a Data Matrix”: http://www.codeproject.com/Articles/36462/Binding-a-ListView-to-a-Data-Matrix Code Project的示例很好用,但是当我将其用于我的上下文时,它失败了。由于我所做的唯一更改是将XAML放置在DataTemplate/TemplateSelector中,因此问题可能与此相关。
<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为空以及我该怎么做?
编辑: SledgeHammer明确指出,我试图做的是一个糟糕的hack,它失败了。正确的方法是直接将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}添加到多绑定中吗?
ListToMatrixConverter
类的Convert
方法中设置断点,检查返回值。你是否在运行时期望了返回值? - Ramin Bateni