2010-08-24 6 views
4

J'ai implémenté quelques comportements et déclencheurs personnalisés et les ai ajoutés via XAML. Ils fonctionnent bien lors de l'exécution mais empêchent le chargement de la vue du concepteur CIDER au moment de la conception, et causeront vraisemblablement un problème dans Blend, bien que je ne l'aie pas confirmé.Problème de conception avec les comportements personnalisés et les déclencheurs dans Silverlight

Voici un aperçu de ce que j'ai implémenté pour l'un des comportements; J'espère que quelqu'un peut signaler ce qui me manque.

Le comportement ressemble à ceci; Une implémentation en XAML ressemble à ceci:

using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Interactivity; 

namespace MiX.Core.UI.Silverlight 
{ 
    public class UpdateOnTextChangedBehavior : Behavior<TextBox> 
    { 
     protected override void OnAttached() 
     { 
      base.OnAttached(); 
      this.AssociatedObject.TextChanged += OnAssociatedObjectTextChanged; 
     } 

     void OnAssociatedObjectTextChanged(object sender, TextChangedEventArgs e) 
     { 
      BindingExpression binding = this.AssociatedObject.GetBindingExpression(TextBox.TextProperty); 
      if (binding != null) 
      { 
       binding.UpdateSource(); 
      } 
     } 

     protected override void OnDetaching() 
     { 
      base.OnDetaching(); 
      this.AssociatedObject.TextChanged -= OnAssociatedObjectTextChanged; 
     } 
    } 
} 

<TextBox x:Name="Username" Text="{Binding Username,Mode=TwoWay}" BorderThickness="1" Style="{StaticResource TextBoxStyleGeneral}" Foreground="#FF333333" FontSize="10" BorderBrush="{x:Null}" Grid.Column="1" d:LayoutOverrides="GridBox" Margin="2,0" Grid.ColumnSpan="2" Background="{x:Null}" VerticalAlignment="Center" Grid.Row="1"> 
    <i:Interaction.Behaviors> 
    <mixcore:UpdateOnTextChangedBehavior/> 
    </i:Interaction.Behaviors> 
</TextBox> 

Dans l'éditeur XAML l'élément <mixcore:UpdateOnPasswordChangedBehavior/> est mis en évidence avec un gribouillis et signale l'erreur Une valeur de type « UpdateOnTextChangedBehavior » ne peut pas être ajouté à une collection ou un dictionnaire de type « BehaviorCollection ». Lors de la tentative d'affichage en mode Création, le concepteur ne parvient pas à se charger, indiquant Le document contient des erreurs qui doivent être corrigées avant que le concepteur puisse être chargé.

+1

Démarrage d'un nouveau projet et la copie de votre exemple de code semble fonctionner très bien (pour moi) en VS2010 sans concepteur ou Blend questions. Faites-vous autre chose avec le TextBox ou Behaviour dans le code-behind? –

+0

Dan, tu as l'air d'avoir raison. Dans l'application réelle, il y a deux actions à part ce comportement et je vois que l'une d'entre elles appelle une méthode qui utilise la réflexion pour définir les valeurs de propriété de dépendance. Peut-être que c'est ce qui l'empêche de travailler au moment du design. –

Répondre

1

Dans Silverlight, si le design ne peut pas charger avec les changements que nous avons faits dans le code, il est bug dans silverlight.

Silverlight n'est pas encore conçu pour gérer diverses exceptions par code, comme si vous aviez du code avec le type de retour et que vous ne vérifiiez pas null là-bas, puis encore il ne charge pas le concepteur Avec Overriding la méthode IValueConverter {x: Static} ... et ainsi de suite

Il n'y a rien de mal dans votre code, sauf si elle compile bien et ne rejette pas d'exception. Ne vous inquiétez pas pour le designer.

De même, un cas, vous pouvez consulter: http://connect.microsoft.com/VisualStudio/feedback/details/361509/xaml-designer-cannot-handle-typename-with-nested-classes

Questions connexes