2010-11-10 7 views
3

Je tente de créer un contrôle personnalisé pour la plate-forme Windows Phone 7. Jusqu'à présent, j'ai la propriété définie et cela fonctionne bien si c'est un type simple (comme une chaîne), mais cela doit finalement être un tableau. Donc, je définis mes biens comme ceci:Liaison aux propriétés sauvegardées par tableau

#region Keywords 

    public string[] Keywords 
    { 
     get { return (string[])GetValue(KeywordsProperty); } 
     set { SetValue(KeywordsProperty, value); } 
    } 

    public static readonly DependencyProperty KeywordsProperty = 
     DependencyProperty.Register(
      "Keywords", 
      typeof(string[]), 
      typeof(MyType), 
      new PropertyMetadata(null)); 

    #endregion Keywords 

Maintenant, je veux un soutien top obligatoire et XAML, mais je ne peux pas comprendre comment définir la propriété via XAML. Y a-t-il une meilleure manière de faire cela?

Répondre

5

En utilisant une chaîne [] dans XAML

Vous pouvez instancier keywords en XAML comme suit:

<MyControl ...> 
    <MyControl.Keywords> 
    <sys:String>Happy</sys:String> 
    <sys:String>Sad</sys:String> 
    <sys:String>Angry</sys:String> 
    </MyControl.Keywords> 
</MyControl> 

Note: Ceci suppose la déclaration d'espace de noms

xmlns:sys="clr-namespace:System;assembly=mscorlib" 

Vous peut lier un ItemsControl à vos mots clés comme suit:

<ListBox ItemsSource="{Binding Keywords}" ...> 

Dans cet exemple, chaque mot clé apparaîtra sous la forme d'un élément ListBox distinct. L'utilisation d'une chaîne [] à cet effet dans WPF est parfaitement kasher, tant que les membres du groupe sont garantis de ne jamais changer (vous pouvez remplacer le tableau par un nouveau, mais ne pas changer ses éléments). C'est parce qu'un tableau n'a aucun mécanisme de notification de changement.

Si vos éléments peuvent changer

Si les éléments de votre tableau Mots-clés peuvent changer, vous devez utiliser un ObservableCollection au lieu d'un tableau. Faites-en une propriété CLR en lecture seule (pas une propriété de dépendance) et initialisez-la dans votre constructeur. Ensuite, vous pouvez le remplir en XAML exactement comme indiqué ci-dessus, mais toutes les modifications apportées à la collection seront immédiatement répercutées dans votre interface utilisateur.

J'utilise en fait mes propres classes de collection pour cela qui ont beaucoup plus de fonctionnalités que ObservableCollection. La classe de collection que vous utilisez n'a pas d'importance tant qu'elle implémente INotifyCollectionChanged.

Faire la liste actualisable en utilisant XAML pur

Vous ne pouvez pas mettre à jour vos mots-clés tableau en utilisant une liaison. Si vous devez mettre à jour les mots-clés et que vous voulez le faire entièrement en utilisant XAML et les liaisons, vous devez créer une classe d'objet Keyword qui contient la chaîne, puis les placer dans un ObservableCollection ou similaire.

IValueConverter

Une autre approche consiste à utiliser un IValueConverter pour convertir une liste séparée par des virgules des chaînes vers et à partir d'une chaîne [], comme ceci:

<TextBox Text="{Binding Keywords, 
         Converter={x:Static my:CommaSeparatedConverter.Instance}}" /> 

où le convertisseur serait :

public class CommaSeparatedConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    return string.Join(",", (string[])value); 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    return ((string)value).Split(','); 
    } 
} 
+0

Je reçois une erreur sur x: Array (Le type 'x: Array' n'a pas été trouvé). Plus tôt dans le document xmlns: x est défini comme "http://schemas.microsoft.com/winfx/2006/xaml", et x: fonctionne comme d'habitude ailleurs dans la page. – Hounshell

+0

En outre, y a-t-il une manière plus WPF-ish de faire ceci? Comme une collection observable ou quelque chose. Je ne vais pas mettre à jour la liste, juste la vérifier de temps en temps. – Hounshell

+0

Puisque les mots-clés sont déclarés en tant que chaîne [], vous n'avez pas réellement besoin de la syntaxe x: Array dans le code XAML. Je l'ai enlevé de ma réponse. (Je suis déconcertée de savoir pourquoi cela n'a pas fonctionné pour vous: j'utilise x: Array fréquemment et ça sonnait comme si vous le faisiez correctement.) J'ai également ajouté plus d'informations sur quand et pourquoi vous pourriez utiliser ObservableCollection au lieu de x: Array. –

0

Vous devriez être en mesure de se lier à un élément spécifique d'un tableau de cette façon:En supposant bien sûr que les mots-clés sont disponibles dans le DataContext actuel.

+0

J'essaie de lier un tableau entier de chaînes à une seule propriété qui est elle-même une chaîne [], pas un élément du tableau – Hounshell

+0

Gotcha. Désolé pour la confusion. –

Questions connexes