ContentControl.ContentTemplateSelector Egenskap

Definition

Hämtar eller anger en mallväljare som gör det möjligt för en programskrivare att tillhandahålla anpassad logik för mallval.

public:
 property System::Windows::Controls::DataTemplateSelector ^ ContentTemplateSelector { System::Windows::Controls::DataTemplateSelector ^ get(); void set(System::Windows::Controls::DataTemplateSelector ^ value); };
[System.ComponentModel.Bindable(true)]
public System.Windows.Controls.DataTemplateSelector ContentTemplateSelector { get; set; }
[<System.ComponentModel.Bindable(true)>]
member this.ContentTemplateSelector : System.Windows.Controls.DataTemplateSelector with get, set
Public Property ContentTemplateSelector As DataTemplateSelector

Egenskapsvärde

En datamallsväljare. Standardvärdet är null.

Attribut

Exempel

I följande exempel visas hur du använder egenskapen ContentTemplateSelector . Det här exemplet binder det markerade objektet i en ComboBox till Content egenskapen för en Label, som ärver från ContentControl. När användaren väljer ett värde under 5 visas värdet för det markerade objektet i en svart fyrkant i Label. När användaren väljer ett värde som är 5 eller högre visas värdet i en grön ellips. Exemplet åstadkommer detta genom att skapa två DataTemplate objekt och en DataTemplateSelector, som är inställd på ContentTemplateSelector egenskapen och väljer lämpligt DataTemplate baserat på värdet för det valda objektet.

<Window.Resources>

  <!--Create two DataTemplate objects to be 
  selected by the DataTemplateSelector.-->
  <DataTemplate x:Key="numberTemplate">
    <Grid>
      <Rectangle Stroke="Black" />
      <TextBlock Margin="5" Text="{Binding}" FontSize="18"/>
    </Grid>
  </DataTemplate>

  <DataTemplate x:Key="largeNumberTemplate">
    <Grid>
      <Ellipse Stroke="Green" StrokeThickness="4"/>
      <TextBlock Margin="10" Text="{Binding}" FontSize="24" 
                 Foreground="Red" FontWeight="Bold" />
    </Grid>
  </DataTemplate>

  <local:NumberDataTemplateSelector x:Key="numberTemplateSelector"
                                    NumberTemplate="{StaticResource numberTemplate}"
                                    LargeNumberTemplate="{StaticResource largeNumberTemplate}"/>

</Window.Resources>
<StackPanel>

  <!--Bind the content of the Label to the selected item 
  in the ComboBox.-->
  <Label  Foreground="Black"
          Content="{Binding ElementName=numberList, Path=SelectedItem.Content}"
          ContentTemplateSelector="{StaticResource numberTemplateSelector}">
  </Label>

  <ComboBox Name="numberList">
    <ComboBoxItem>1</ComboBoxItem>
    <ComboBoxItem>2</ComboBoxItem>
    <ComboBoxItem>3</ComboBoxItem>
    <ComboBoxItem>4</ComboBoxItem>
    <ComboBoxItem>5</ComboBoxItem>
    <ComboBoxItem>6</ComboBoxItem>
    <ComboBoxItem IsSelected="True">7</ComboBoxItem>
    <ComboBoxItem>8</ComboBoxItem>
    <ComboBoxItem>9</ComboBoxItem>
    <ComboBoxItem>10</ComboBoxItem>
  </ComboBox>

</StackPanel>
public class NumberDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate NumberTemplate { get; set; }
    public DataTemplate LargeNumberTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        // Null value can be passed by IDE designer
        if (item == null) return null;

        var num = Convert.ToInt32((string)item);
        
        // Select one of the DataTemplate objects, based on the 
        // value of the selected item in the ComboBox.
        if (num < 5)
        {
            return NumberTemplate;
        }
        else
        {
            return LargeNumberTemplate;
        }
    }
}
Public Class NumberDataTemplateSelector
    Inherits DataTemplateSelector

    Public Property NumberTemplate As DataTemplate
    Public Property LargeNumberTemplate As DataTemplate

    Public Overrides Function SelectTemplate(ByVal item As Object, _
                    ByVal container As DependencyObject) As DataTemplate

        ' Nothing can be passed by IDE designer
        if (item Is Nothing) Then
            Return Nothing
        End If

        Dim num = Convert.ToInt32(CStr(item))

        ' Select one of the DataTemplate objects, based on the 
        ' value of the selected item in the ComboBox.
        If num < 5 Then
            Return NumberTemplate

        Else
            Return LargeNumberTemplate
        End If

    End Function 'SelectTemplate
End Class

Kommentarer

Vanligtvis skapar du en DataTemplateSelector när du har fler än en DataTemplate för samma typ av objekt och du vill ange din egen logik för att välja en DataTemplate som ska tillämpas baserat på egenskaperna för varje dataobjekt. Observera att om du har objekt av olika typer kan du ange DataType egenskapen på DataTemplate. Om du gör det behöver du inte skapa en DataTemplateSelector. Om du har objekt av samma typ men med olika egenskaper kan du också överväga att använda en DataTrigger datakonverterare eller en datakonverterare. Mer information finns i Översikt över dataöverläggning.

Om du vill skapa en mallväljare skapar du en klass som ärver från DataTemplateSelector och åsidosätter SelectTemplate metoden. När klassen har definierats kan du tilldela en instans av klassen till mallväljaregenskapen för ditt element.

Om både ContentTemplateSelector egenskaperna och ContentTemplate anges ignoreras den här egenskapen.

XAML-attributanvändning

<object ContentTemplateSelector="{ResourceExtension TemplateSelectorKey}"/>

XAML-värden

ResourceExtension Ett påläggstillägg som identifierar hur du refererar till mallresursen, antingen StaticResource eller DynamicResource. Se XAML-resurser.

TemplateSelectorKey Nyckeln som identifierar den begärda mallväljaren. Nyckeln refererar till en befintlig resurs i en ResourceDictionary.

Information om beroendeegenskap

Objekt Value
Identifierarfält ContentTemplateSelectorProperty
Metadataegenskaper inställda på true Ingen

Gäller för