2010-01-18 8 views
1

J'ai un TreeView et quelques autres contrôles comme TextBox es et ComboBox es. Les TextBox es sont liés à l'élément sélectionné dans la TreeView comme ceci:WPF Liaison conditionnelle

Text="{Binding SelectedItem.Name, ElementName=groupTreeView}" 

Cela fonctionne bien si tous les éléments de mon TreeView ont une Name propriété.

Je me demandais s'il y avait un moyen de faire une sorte de bind conditionnelle qui dit:

if SelectedItem is MyTreeType 
    then bind 
else 
    disable the element 

Est-il possible de faire quelque chose comme ça? À l'heure actuelle, je ne fais que lancer des erreurs de liaison et cela me semble un peu sale. Mon TreeView est databound et a quelques types de classes différentes, c'est pourquoi je cherche une sorte de liaison conditionnelle.

Merci, Raul

Répondre

0

Eh bien, je fini par créer un « CastingConverter » que je vous envoie le type en tant que paramètre

public class CastingConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
      return null; 

     if (parameter == null) 
      throw new ArgumentNullException("parameter"); 

     var type = parameter as Type; 

     if (type == null) 
      throw new ArgumentException("parameter must be a type"); 

     var itemType = value.GetType(); 

     if (type.IsAssignableFrom(itemType)) 
      return value; 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Alors je viens lié à ce qui suit

DataContext="{Binding SelectedItem, ElementName=groupTreeView, Converter={StaticResource CastingConverter}, ConverterParameter={x:Type vm:GroupViewModel}}" 
1

C'est pourquoi il est toujours une bonne idée de passer outre ToString dans vos classes de vue. Pour ce faire, vous pouvez simplement lier Text à SelectedItem.

+0

Bien sûr, qui fonctionne pour l'affichage du texte, mais il ne sera pas mise à jour soutenir la propriété Name, et il fonctionne pas non plus si vous avez un beaucoup de propriétés sur votre objet. – HaxElit

1

Regardez en utilisant la Model-View ViewModel (MVVM), votre code de liaison est simple et la logique est dans une classe testable. C'est plus de travail pour commencer, mais tend à conduire à moins de problèmes à long terme.

Voici une très bonne vidéo, vous devriez jeter un oeil à: ne Jason Dolinger on Model-View-ViewModel