0

我正在学习自定义控件,并以 autoCompleteTextBox 为例。我正在为 WPF 项目(v 4.5 和 vb.net 4.5)创建自定义控件,它使用文本框基类。然后,我向控件添加了一个弹出窗口、列表框和按钮。我在列表框的数据模板的自定义控件中有一个依赖属性,但我无法将数据模板 pssed 到列表框。

这是数据模板的依赖属性:

#Region "DEPENDENCY PROPERTIES -- ItemTemplate"
    Public Property ItemTemplate As DataTemplate
        Get
            Return GetValue(ItemTemplateProperty)
        End Get
        Set(ByVal value As DataTemplate)
            SetValue(ItemTemplateProperty, value)
        End Set
    End Property
    Public Shared ReadOnly ItemTemplateProperty As DependencyProperty = DependencyProperty.Register( _
                        "ItemTemplate", GetType(DataTemplate), GetType(AutoCompleteTextBox), _
                        New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.None, _
                        New PropertyChangedCallback(AddressOf OnItemTemplateChanged)))

    Shared Sub OnItemTemplateChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
        Dim actb As AutoCompleteTextBox = TryCast(d, AutoCompleteTextBox)
         If actb IsNot Nothing Then
            Dim TempTemplate As DataTemplate = TryCast(e.NewValue, DataTemplate)
            If TempTemplate IsNot Nothing Then
                actb.ItemTemplate = TempTemplate
            End If
        End If
     End Sub
#End Region

这是我用于声明用户控件的小文本的 xaml:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:krisis="clr-namespace:Krisis.Controls;assembly=Krisis.Controls"
    Title="MainWindow" Height="350" Width="525" x:Name="MyWindow"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Window.Resources>
        <DataTemplate x:Key="CollectionTemplate">
            <Border BorderBrush="Green" BorderThickness="2" CornerRadius="5" Padding="5,5,5,2">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <TextBlock Text="OBJECT:  "/>
                    <TextBlock Grid.Column="1" Text="{Binding Name}"/>
                    <TextBlock Grid.Row="1" Text="{Binding id}"/>
                    <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding Job}"/>
                </Grid>
            </Border>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <krisis:AutoCompleteTextBox ItemsSource="{Binding Collection}" 
                                    ItemTemplate="{StaticResource CollectionTemplate}" 
                                    MaxmimumMatches="15" 
                                    MinimumFilterCharacters="1" 
                                    DisplayPath="Name"
                                    Width="497" MinHeight="35" FontSize="18" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,41,10,243" />
    </Grid>
</Window>

我的问题:当我使用它来声明我的 itemtemplate 时,它​​没有被应用。列表框只显示列表框中每个对象的对象类型名称,而不是任何对象属性值。

有人可以帮我使用依赖属性来传递自定义控件内列表框的 DataTemplate。

提前致谢

4

1 回答 1

0

okay, I chnaged where i assign the itemtemplate to the following and it now works:

#Region "APPLY TEMPLATE"
    Public Overrides Sub OnApplyTemplate()
        MyBase.OnApplyTemplate()

        '' if template is not nothing then initialize controls and wire up the event handlers
        If Me.Template IsNot Nothing Then

            InitializeListbox()
            If ResultsListBox IsNot Nothing Then
                OnItemSourceChanged(ItemsSource)
                AddHandler ResultsListBox.KeyDown, AddressOf ResultListBox_KeyDown
                AddHandler ResultsListBox.SelectionChanged, AddressOf ResultListBox_SelectionChanged
                ResultsListBox.ItemTemplate = ItemTemplate
                ResultsListBox.ItemsSource = ItemsSource
            End If
        End If
    End Sub
#End Region
于 2013-04-20T21:00:45.477 回答