3

J'essaie de créer un comportement joint qui peut être appliqué à une ComboBox Silverlight.Comportement attaché ComboBox Silverlight

Mon comportement est le suivant:

using System.Windows.Controls; 
using System.Windows; 
using System.Windows.Controls.Primitives; 

namespace AttachedBehaviours 
{ 
    public class ConfirmChangeBehaviour 
    { 

     public static bool GetConfirmChange(Selector cmb) 
     { 
      return (bool)cmb.GetValue(ConfirmChangeProperty); 
     } 

     public static void SetConfirmChange(Selector cmb, bool value) 
     { 
      cmb.SetValue(ConfirmChangeProperty, value); 
     } 


     public static readonly DependencyProperty ConfirmChangeProperty = 
      DependencyProperty.RegisterAttached("ConfirmChange", typeof(bool), typeof(Selector), new PropertyMetadata(true, ConfirmChangeChanged)); 
     public static void ConfirmChangeChanged(DependencyObject d, DependencyPropertyChangedEventArgs args) 
     { 
      Selector instance = d as Selector; 

      if (args.NewValue is bool == false) 
       return; 

      if ((bool)args.NewValue) 
       instance.SelectionChanged += OnSelectorSelectionChanged; 
      else 
       instance.SelectionChanged -= OnSelectorSelectionChanged; 

     } 

     static void OnSelectorSelectionChanged(object sender, RoutedEventArgs e) 
     { 
      Selector item = e.OriginalSource as Selector; 

      MessageBox.Show("Unsaved changes. Are you sure you want to change teams?");  

     } 

    } 

} 

Ceci est utilisé en XAML comme ceci:

<UserControl x:Class="AttachedBehaviours.MainPage" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:this="clr-namespace:AttachedBehaviours" 
      mc:Ignorable="d"> 
    <Grid x:Name="LayoutRoot"> 
     <StackPanel> 
      <ComboBox ItemsSource="{Binding Teams}" 
         this:ConfirmChangeBehaviour.ConfirmChange="true" > 
      </ComboBox> 
     </StackPanel> 
    </Grid> 
</UserControl> 

Je reçois une erreur:

Unknown attribute ConfirmChangeBehaviour.ConfirmChange on element ComboBox. [Line: 13 Position: 65]

IntelliSense capte le comportement , pourquoi est-ce échouer à l'exécution?

Merci, Mark

EDIT: Register() a changé à RegisterAttached(). La même erreur apparaît.

Répondre

4

Vous avez votre propriété attachée erreurs de repérage

public static readonly DependencyProperty ConfirmChangeProperty = 
     DependencyProperty.RegisterAttached("ConfirmChange", typeof(bool), typeof(Selector), new PropertyMetadata(true, ConfirmChangeChanged)); 

Devrait être

public static readonly DependencyProperty ConfirmChangeProperty = 
     DependencyProperty.RegisterAttached("ConfirmChange", typeof(bool), typeof(ConfirmChangeBehaviour), new PropertyMetadata(true, ConfirmChangeChanged)); 

je vous conseille de passer à l'aide du mélange Interactivité Behaviors. L'écriture de XAML par opposition à l'utilisation d'un outil ne rend jamais les concepteurs heureux.

+2

Comme astuce, Visual Studio a un extrait ('propa') qui peut aider à éviter ce genre de fautes de frappe (bien qu'il vous permette encore d'obtenir la classe propriétaire erronée, soupir). – itowlson

1

Vous devez changer ceci:

DependencyProperty.Register("ConfirmChange"... 

à ceci:

DependencyProperty.RegisterAttached("ConfirmChange"... 

Les propriétés attachées (y compris les comportements attachés) doit être enregistré à l'aide RegisterAttached plutôt que simplement vieux registre.

+1

Merci pour le conseil et la réponse rapide +1. Vous avez raison à propos de la nouvelle inscription, mais le message d'erreur est toujours le même? D'autres idées? –