首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将DataTemplate与ContentControl绑定到ContentTemplateSelector

将DataTemplate与ContentControl绑定到ContentTemplateSelector
EN

Stack Overflow用户
提问于 2014-09-10 16:39:54
回答 1查看 3.7K关注 0票数 1

我的Window.Resources中有3个Window.Resources,强类型为三个不同的类:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<local:SampleDataTemplateSelector x:Key="myBindPropertyTemplateSelector"
    TemplateA="{StaticResource myTemplateA}"
    TemplateB="{StaticResource myTemplateB}" 
    SampleClassBaseTemplate="{StaticResource myTemplateBase}" />

显然,有一个DataTemplateSelector类,称为SampleDataTemplateSelector。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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设置如下:

代码语言:javascript
复制
<ContentControl Content="{Binding BindProperty}" ContentTemplateSelector="{StaticResource myBindPropertyTemplateSelector}" />

其中BindProperty是在后面的窗口代码上定义的属性:

代码语言:javascript
复制
Dim myBindProperty As SampleClass
Public ReadOnly Property BindProperty As SampleClass
    Get
        Return myBindProperty
    End Get
End Property

毕竟,在我的窗口加载事件中存在BindProperty初始化。

代码语言:javascript
复制
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    myBindProperty = New SampleClassA()
End Sub

没有编译错误。在执行过程中,SampleDataTemplateSelector的SelectTemplate例程上的item参数从来都不是什么,所以它不能选择正确的模板.什么都没显示出来。我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-10 18:14:46

我重新创建了您的项目,如果您将DataContext = Me添加到Window_Loaded中,它就会工作。我将您的模板更改为使用StackPanel而不是网格(这样文本块就不会相互重叠)。以下是一个完整的工作版本:

MainWindow.xaml

代码语言:javascript
复制
<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication20"
    Loaded="Window_Loaded"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate x:Key="myTemplateA" DataType="{x:Type local:SampleClassA}">
            <StackPanel>
                <TextBlock Text="{Binding Path=SampleProperty1}"></TextBlock>
                <TextBlock Text="{Binding Path=SampleProperty2}"></TextBlock>
                <TextBlock Text="{Binding Path=SamplePropertyA}"></TextBlock>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="myTemplateB" DataType="{x:Type local:SampleClassB}">
            <StackPanel>
                <TextBlock Text="{Binding Path=SampleProperty1}"></TextBlock>
                <TextBlock Text="{Binding Path=SampleProperty2}"></TextBlock>
                <TextBlock Text="{Binding Path=SamplePropertyB}"></TextBlock>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="myTemplateBase" DataType="{x:Type local:SampleClass}">
            <StackPanel>
                <TextBlock Text="{Binding Path=SampleProperty1}"></TextBlock>
                <TextBlock Text="{Binding Path=SampleProperty2}"></TextBlock>
            </StackPanel>
        </DataTemplate>

        <local:SampleDataTemplateSelector x:Key="myBindPropertyTemplateSelector"
            TemplateA="{StaticResource myTemplateA}"
            TemplateB="{StaticResource myTemplateB}" 
            SampleClassBaseTemplate="{StaticResource myTemplateBase}" />
    </Window.Resources>
    <Grid>
        <ContentControl Content="{Binding BindProperty}" ContentTemplateSelector="{StaticResource myBindPropertyTemplateSelector}" />
    </Grid>
</Window>

MainWindow.xaml.vb

代码语言:javascript
复制
Class MainWindow 
    Dim myBindProperty As SampleClass
    Public ReadOnly Property BindProperty As SampleClass
        Get
            Return myBindProperty
        End Get
    End Property

    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
        myBindProperty = New SampleClassA()
        DataContext = Me
    End Sub
End Class

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

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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25770783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档