2010-02-04 6 views
4

Je tente de lier une propriété IsLoading à la propriété Cursor de la grille LayoutRoot de mon interface utilisateur. J'essaie de faire en sorte que le curseur de l'application principale devienne un sablier chaque fois que la propriété dit qu'elle est en train de charger.Comment lier la propriété Cursor d'une grille à une propriété de mon ViewModel dans Silverlight 3.0?

Je liant la propriété comme suit:

<Grid Cursor="{Binding IsLoading, Converter={StaticResource CursorConverter}}"> 

Les principales cartes de « CursorConverter » au BoolToCursorConverter des ressources. Le code de conversion est:

public class BoolToCursorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (parameter == null) 
      return ((bool)value == true) ? Cursors.Wait : Cursors.Arrow; 
     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Cursor cursor = value as Cursor; 
     if (cursor != null) 
      return cursor == Cursors.Wait ? true : false; 
     return false; 
    } 
} 

Lorsque je tente d'exécuter ce que je reçois le XamlParseException « La clé donnée était présent dans le dictionnaire. »

Toute aide serait appréciée, merci,

Répondre

6

Pourquoi vous obtenez cette erreur

Avez-vous quelque chose comme ça dans le contenu d'une propriété des ressources?

<local:BoolToCursorConverter x:Key="CursorConverter" /> 

Si non, c'est ce qui ne va pas mais je suppose que vous le faites déjà.

Dans ce cas, je suppose que vous l'avez placé dans la propriété Resources du Grid auquel il s'applique. Ce serait pourquoi on ne peut pas le trouver. StaticResource sont résolues immédiatement lorsque Xaml est analysé. Par conséquent, toute clé utilisée doit déjà être chargée dans un dictionnaire de ressources avant utilisation. L'analyseur Xaml ne sait rien du contenu de la propriété Resources de la grille car il ne l'a pas encore traité. Par conséquent: -

<UserControl> 
    <Grid Cursor="{Binding IsLoading, Converter={StaticResource CursorConverter}}"> 
    <Grid.Resources> 
     <local:BoolToCursorConverter x:Key="CursorConverter" /> 
    </Grid.Resources> 
    <!-- Contents here --> 
    </Grid> 
</UserControl> 

échouera. Où: -

<UserControl> 
    <UserControl.Resources> 
    <local:BoolToCursorConverter x:Key="CursorConverter" /> 
    </UserControl.Resources > 
    <Grid Cursor="{Binding IsLoading, Converter={StaticResource CursorConverter}}"> 
    <!-- Contents here --> 
    </Grid> 
</UserControl> 

ne manquerait pas de trouver le convertisseur.

Ce que vous devez vraiment faire

J'ai présenté ci-dessus pour répondre à votre question, mais je peux le voir ne pas vraiment vous aider. Vous ne pouvez pas lier à la propriété Cursor comme ceci. (Il n'expose pas un champ d'identificateur public, Xaml utilise la convention NameOfThing + "Propriété" pour trouver un champ correspondant à DependencyProperty pour la propriété liée).

La solution est de créer une propriété attachée: -

public class BoolCursorBinder 
{ 
    public static bool GetBindTarget(DependencyObject obj) { return (bool)obj.GetValue(BindTargetProperty); } 
    public static void SetBindTarget(DependencyObject obj, bool value) { obj.SetValue(BindTargetProperty, value); } 

    public static readonly DependencyProperty BindTargetProperty = 
      DependencyProperty.RegisterAttached("BindTarget", typeof(bool), typeof(BoolCursorBinder), new PropertyMetadata(false, OnBindTargetChanged)); 

    private static void OnBindTargetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     FrameworkElement element = sender as FrameworkElement; 
     if (element != null) 
     { 
      element.Cursor = (bool)e.NewValue ? Cursors.Wait : Cursors.Arrow; 
     } 
    } 
} 

Maintenant, vous pouvez réellement faire la liaison comme ceci: -

<Grid local:BoolCursorBinder.BindTarget="{Binding IsLoading}"> 
+0

travaillé comme un charme, merci !! –

+0

Et merci pour la bonne explication aussi –

Questions connexes