2010-12-11 11 views
0

J'ai un peu de problème avec les comportements attachés. Je souhaite fournir une liaison à une propriété de dépendance, mais la valeur n'est pas connue tant que le ViewModel n'est pas initialisé, le Setter échoue donc.La propriété attachée définie dans la classe statique ne fonctionne pas

Actuellement, j'ai ce code:

  <Style TargetType="{x:Type visi:Chart}"> 
       <Setter Property="att:ChartBehaviour.ExecuteCommandOnDoubleClick" Value="true"/> 
       <Setter Property="att:ChartBehaviour.ShowHideCommand" Value="{Binding OverviewHideCommand}"/> 
      </Style> 

Le premier compositeur fonctionne parfaitement bien, mais le second n'a pas, comme OverviewHideCommand ne seront pas disponibles (c.-à-est null au point de départ. application de style) jusqu'à ce que l'objet de sauvegarde soit construit.

Des pointeurs sur la façon de contourner ce problème? J'aimerais vraiment rester en xaml si possible.

Edit:

Le problème est Apperently dans la définition de ShowHideCommand, qui est définie comme propriété attachée (la classe est dans un espace de noms différent de celui du XAML lui-même, mais le XAML fait référence à l'espace de noms):

public static class ChartBehaviour 
{ 
    public static readonly DependencyProperty ShowHideCommandProperty = 
     DependencyProperty.RegisterAttached("ShowHideCommand", 
              typeof(ICommand), 
              typeof(Chart), 
              new PropertyMetadata(new DefaultCommand())); 
} 

Il est intéressant de noter que la propriété n'apparaît pas dans la classe Chart. Comment devrais-je changer la définition pour qu'elle apparaisse dedans?

Répondre

0

J'ai résolu le problème. En fait, c'était deux problèmes. Tout d'abord: la propriété attachée a été définie pour Chart, et non ChartBehaviour.

Ensuite, il a analysé correctement et a démarré. Ensuite, le deuxième problème relevai - l'événement I spécifié les suivantes:

static void OnMouseDoubleClick(object sender, RoutedEventArgs e) 
{ 
    var obj = e.OriginalSource as Visifire.Charts.Chart; 

    if (obj == null) 
     return; 

    GetShowHideCommand(obj).Execute(null); 
} 

Le problème était cette ligne: var obj = e.OriginalSource as Visifire.Charts.Chart;. Le graphique est un objet très complexe, donc e.OriginalSource renverra un élément Border (ou quelque chose d'autre selon l'endroit où vous double-cliquez). Le membre correct était Source, qui est le graphique lui-même (après que l'événement a parcouru les couches du contrôle de graphique).

1

Vous pouvez déclencher des setters avec la classe Trigger bien nommée. Trigger (et DataTrigger, qui fonctionne de manière similaire mais sur des propriétés non dépendantes qui implémentent INotifyPropertyChanged) peuvent être utilisés pour surveiller une propriété pour une valeur spécifique et, si la valeur change pour une valeur donnée, activer une série de setters.

Un moyen facile d'accomplir ceci serait d'utiliser un déclencheur de données qui surveille votre propriété "objet de support" pour être définie à une valeur non nulle. Lorsque cela se produit, votre setter devrait/devrait être appliqué.

+0

vous pouvez seulement comparer à l'égalité sur DataTrigger, il serait donc difficile de comparer à non null: -/J'ai trouvé une classe de liaison personnalisée pour cela mais cela semble un peu exagéré. – Femaref

+0

Convertisseur personnalisé? C'est vraiment très commun. Je travaille sur une application WPF lourde, certains des convertisseurs les plus courants sont booléens à visibilité, non null (avec un paramètre inversé), etc. – Brandyn