2011-04-24 4 views
0

Je classe Markercomportement Mimic ItemsControl dans le contrôle personnalisé

class Marker { 
    public double Position {get; set;} 
    public string Label {get; set;} 
} 

et contrôle personnalisé, entre autres propriétés, expose la collection de marqueurs

class MyControl { 
    public ObservableCollection<Marker> Markers {get; set;} 
} 

Je voudrais imiter le comportement ItemsControl et permettre les utilisateurs de mon composant pour spécifier des marqueurs directement ou en utilisant l'analogie ItemsSource. De plus, je voudrais deux méthodes pour soutenir la liaison de données (de préférence en XAML)

marqueurs directement

<my:MyControl> 
    <my:MyControl.Markers> 
    <my:Marker Position="{Binding X}" /> 
    </my:MyControl.Markers> 
</my:MyControl> 

marqueur en utilisant MarkersSource

<my:MyControl MarkersSource={Binding UserSpecifiedCollection}"> 
</my:MyControl> 

La première méthode est assez simple mais je Je me bats avec le second.

Comment puis-je implémenter MarkesSource? Comment les éléments de UserSpecifiedCollection peuvent-ils être convertis en type Marqueur? Comment les propriétés des éléments UserSpecifiedCollection peuvent-elles être databound aux propriétés de Marker?

Cordialement conversion Je pense qu'un ValueConvertor peut être utilisé, mais je préférerais une solution XAML pure, quelque chose comme DataTemplates. C'est possible?

Répondre

0

Vous avez besoin de propriétés de dépendance pour les liaisons, vous pouvez "recycler" les propriétés des autres contrôles en utilisant DependencyProperty.AddOwner ou simplement créer les vôtres. En outre, vous souhaitez probablement "transférer" la liaison de votre propriété à la commande ItemsControl interne ou à tout ce que vous utilisez, par ex.

<UserControl x:Class="Test.UserControls.MyUserControl3" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      Name="control"> 
    <Grid> 
     <!-- Binds to the new property --> 
     <ItemsControl ItemsSource="{Binding ElementName=control, Path=MarkersSource}"/> 
    </Grid> 
</UserControl> 
public partial class MyUserControl3 : UserControl 
{ 
    public static readonly DependencyProperty MarkersSourceProperty = 
      DependencyProperty.Register("MarkersSource", 
             typeof(ObservableCollection<Employee>), 
             typeof(MyUserControl3), 
             new UIPropertyMetadata(null)); 
    public ObservableCollection<Employee> MarkersSource 
    { 
     get { return (ObservableCollection<Employee>)GetValue(MarkersSourceProperty); } 
     set { SetValue(MarkersSourceProperty, value); } 
    } 

    public MyUserControl3() 
    { 
     InitializeComponent(); 
    } 
} 

Exemple d'utilisation:

<uc:MyUserControl3 MarkersSource="{Binding DpData}"> 
    <uc:MyUserControl3.Resources> 
     <DataTemplate DataType="{x:Type obj:Employee}"> 
      <TextBlock Text="{Binding Name}" Foreground="Red"/> 
     </DataTemplate> 
    </uc:MyUserControl3.Resources> 
</uc:MyUserControl3> 

Ici, j'applique implicitement un DataTemplate via des ressources, mais vous pouvez simplement créer une autre propriété (réutilisation ItemsControl.ItemTemplate) et en avant que l'interne ItemsControl.

+0

La mise en évidence de la syntaxe dépend des balises de la question. –

+0

@Rick Sladkey: Alors j'ai entendu; ça serait sûrement sympa si ça devait être un peu plus intelligent que ça ... –

+0

C'était un aha pour moi pourquoi ça agissait différemment parfois. –

Questions connexes