简体   繁体   中英

Creating a custom WPF control and set a DataTemplate as a Dependency Property

I'm creating a new control for my WPF application. In it, I have added two dependency properties. These ones is to give style a listbox with a bullet decorator.

Here is what I have:

public class QuestionControl : Control
{
    static QuestionControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(QuestionControl), new FrameworkPropertyMetadata(typeof(QuestionControl)));
    }

    // Another dependency properties...

    // PossibleAnswers : IEnumerable
    public IEnumerable PossibleAnswers
    {
        get { return (IEnumerable)base.GetValue(PossibleAnswersProperty); }
        set { base.SetValue(PossibleAnswersProperty, value); }
    }

    public static readonly DependencyProperty PossibleAnswersProperty =
      DependencyProperty.Register("PossibleAnswers", typeof(IEnumerable), typeof(QuestionControl));

    // PossibleAnswers : DataTemplate
    public DataTemplate PossibleAnswersTemplate
    {
        get { return (DataTemplate)base.GetValue(PossibleAnswersTemplateProperty); }
        set { base.SetValue(PossibleAnswersTemplateProperty, value); }
    }

    public static readonly DependencyProperty PossibleAnswersTemplateProperty =
      DependencyProperty.Register("PossibleAnswersTemplate", typeof(DataTemplate), typeof(QuestionControl));
}

Then I've got the generic style here. Please, watch the last style I've set the PossibleAnswers to the listbox and the binding is okay. But at the momment to pass the data template (this one is setted to the content control called ContentText ) and watch I've set the template called PossibleAnswersTemplate and it's wrong at this part.

<ContentControl x:Name="ContentText" Margin="2 0 0 0" Content="{Binding}" ContentTemplate="{TemplateBinding PossibleAnswersTemplate}" />

Does not compile. What should be the error?

<Style TargetType="ListBox" x:Key="KinectRadioList">
    <Style.Setters>
        <Setter Property="ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Style.Setters>
                        <Setter Property="OverridesDefaultStyle" Value="True"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                    <ControlTemplate.Resources>
                                        <Style TargetType="{x:Type Ellipse}">
                                            <Style.Setters>
                                                <Setter Property="Fill" Value="Black"/>
                                                <Setter Property="Stroke" Value="Black"/>
                                            </Style.Setters>
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}, Path=IsEnabled}" Value="False">
                                                    <Setter Property="Fill" Value="Black"/>
                                                    <Setter Property="Stroke" Value="Black"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </ControlTemplate.Resources>
                                    <BulletDecorator Background="Transparent" >
                                        <BulletDecorator.Bullet>
                                            <Canvas Width="15" Height="15">
                                                <Ellipse Width="13" Height="13" Canvas.Left="1" Canvas.Top="1" StrokeThickness="1" Fill="{x:Null}"/>
                                                <Ellipse Width="8" Height="8" Canvas.Left="3.5" Canvas.Top="3.5" Stroke="{x:Null}" Visibility="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}, Path=IsSelected, Converter={StaticResource BoolToVisibilityConverter}}"/>
                                            </Canvas>
                                        </BulletDecorator.Bullet>
                                        <ContentControl x:Name="ContentText" Margin="2 0 0 0" Content="{Binding}" ContentTemplate="{TemplateBinding PossibleAnswersTemplate}" />
                                    </BulletDecorator>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style.Setters>
                </Style>
            </Setter.Value>
        </Setter>
    </Style.Setters>
</Style>


<Style TargetType="{x:Type local:QuestionControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:QuestionControl}">
                    <StackPanel>
                        <ContentControl Content="{TemplateBinding QuestionText}"
                                        ContentTemplate="{TemplateBinding QuestionTextTemplate}" />
                        <ListBox ItemsSource="{TemplateBinding PossibleAnswers}" SelectionMode="Multiple"
                                 Style="{StaticResource KinectRadioList}"/>
                    </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
 <ListBox ItemsSource="{TemplateBinding PossibleAnswers}" Tag="{TemplateBinding PossibleAnswersTemplate}" SelectionMode="Multiple"
                             Style="{StaticResource KinectRadioList}"/>

    <ContentControl ContentTemplate="{TemplateBinding Tag}"/>

Your Template is of ListBox and TemplateBinding is Trying to find PossibleAnswersTemplate in ListBox and hence it is not working. I hope this will help.

EDIT: This is another solution

<ContentControl Margin="2 0 0 0" Content="{Binding}" ContentTemplate="{Binding PossibleAnswersTemplate, RelativeSource={RelativeSource AncestorType={x:Type local:QuestionControl}}}" />

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM