【发布时间】:2014-11-04 10:03:21
【问题描述】:
我的 Window.Resources 中有 3 个 DataTemplate,强类型为三个不同的类:
<DataTemplate x:Key="myTemplateA" DataType="{x:Type local:SampleClassA}">
<Grid>
<TextBlock Text="{Binding Path=SampleProperty1}"></TextBlock>
<TextBlock Text="{Binding Path=SampleProperty2}"></TextBlock>
<TextBlock Text="{Binding Path=SamplePropertyA}"></TextBlock>
</Grid>
</DataTemplate>
<DataTemplate x:Key="myTemplateB" DataType="{x:Type local:SampleClassB}">
<Grid>
<TextBlock Text="{Binding Path=SampleProperty1}"></TextBlock>
<TextBlock Text="{Binding Path=SampleProperty2}"></TextBlock>
<TextBlock Text="{Binding Path=SamplePropertyB}"></TextBlock>
</Grid>
</DataTemplate>
<DataTemplate x:Key="myTemplateBase" DataType="{x:Type local:SampleClass}">
<Grid>
<TextBlock Text="{Binding Path=SampleProperty1}"></TextBlock>
<TextBlock Text="{Binding Path=SampleProperty2}"></TextBlock>
</Grid>
</DataTemplate>
还有一点 DataTemplateSelector:
<local:SampleDataTemplateSelector x:Key="myBindPropertyTemplateSelector"
TemplateA="{StaticResource myTemplateA}"
TemplateB="{StaticResource myTemplateB}"
SampleClassBaseTemplate="{StaticResource myTemplateBase}" />
显然有DataTemplateSelector的类,叫做SampleDataTemplateSelector
Public Class SampleDataTemplateSelector
Inherits DataTemplateSelector
Public Property TemplateA As DataTemplate
Public Property TemplateB As DataTemplate
Public Property SampleClassBaseTemplate As DataTemplate
Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
If item Is Nothing Then Return SampleClassBaseTemplate
If item.GetType.Equals(GetType(SampleClassA)) Then
Return TemplateA
End If
If item.GetType.Equals(GetType(SampleClassB)) Then
Return TemplateB
End If
Return SampleClassBaseTemplate
End Function
End Class
DataTemplateSelector 必须区分 3 个简单的类:SampleClass 和 2 个派生类 SampleClassA、SampleClassB。
Public Class SampleClass
Public Property SampleProperty1 As String = "Class SampleClass Property1"
Public Property SampleProperty2 As String = "Class SampleClass Property2"
End Class
Public Class SampleClassA
Inherits SampleClass
Public Property SamplePropertyA As String = "Class SampleClassA"
End Class
Public Class SampleClassB
Inherits SampleClass
Public Property SamplePropertyB As String = "Class SampleClassB"
End Class
在我的窗口 xaml 中,ContentControl 设置如下:
<ContentControl Content="{Binding BindProperty}" ContentTemplateSelector="{StaticResource myBindPropertyTemplateSelector}" />
其中 BindProperty 是定义在窗口代码后面的属性:
Dim myBindProperty As SampleClass
Public ReadOnly Property BindProperty As SampleClass
Get
Return myBindProperty
End Get
End Property
毕竟,在我的窗口加载事件中有 BindProperty 初始化
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
myBindProperty = New SampleClassA()
End Sub
没有编译错误。在执行过程中,SampleDataTemplateSelector 的 SelectTemplate 例程上的 item 参数永远是 Nothing,因此它无法选择正确的模板......并且什么也不显示。我做错了什么?
【问题讨论】:
-
您是否在某处设置了 DataContext?在 C# 中,类似于:this.DataContext = this;
-
我尝试在 xaml (DataContext="{Binding local:BindProperty}") 和后面的代码 (myContentControl.DataContext = myBindProperty) 中设置 DataContext,但没有任何改变。
-
试试,myContentControl.DataContext = this(窗口)。 myBindProperty 不是属性,所以我认为您不能使用它(它必须是属性而不是成员变量)。如果您设置 myContentControl.DataContext = BindProperty,那么您需要将 xaml 更改为 Content="{Binding}" 因为上下文已经是 BindProperty。
-
我在 Load 事件中尝试了 myContentControl.DataContext = Me,不,没有任何变化。
标签: wpf data-binding binding datatemplate contentcontrol