2009-09-25 33 views
3

Dans le cadre de l'apprentissage de WPF, je viens de terminer un exercice MS Lab intitulé «Using Data Binding in WPF» (http://windowsclient.net/downloads/folders/hands-on-labs/entry3729.aspx). Pour illustrer l'utilisation d'un IMultiValueConverter, il existe une implémentation pré-codée de celle dans laquelle le résultat booléen est utilisé pour déterminer si la liaison de données est pertinente pour l'utilisateur actuel. Voici le code pour l'opération de conversion:Wpf Liaison de données avec IMultiValueConverter et erreurs de moulage

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { 
     // var rating = int.Parse(values[0].ToString()); 
     var rating = (int)(values[0]); 
     var date = (DateTime)(values[1]); 

     // if the user has a good rating (10+) and has been a member for more than a year, special features are available 
     return _hasGoodRating(rating) && _isLongTimeMember(date); 
    } 

Et voici le câblage de l'utiliser dans le XAML:

<ComboBox.IsEnabled> 
    <MultiBinding Converter="{StaticResource specialFeaturesConverter}"> 
    <Binding Path="CurrentUser.Rating" Source="{x:Static Application.Current}"/> 
    <Binding Path="CurrentUser.MemberSince" Source="{x:Static Application.Current}"/> 
    </MultiBinding> 
</ComboBox.IsEnabled> 

Le code fonctionne très bien, mais le concepteur XAML ne se charge pas avec un " La distribution spécifiée n'est pas valide. " Erreur. J'ai essayé plusieurs façons de ne pas utiliser un casting, dont l'un d'entre eux que j'ai laissé sans commentaire dans le code ci-dessus. La chose drôle est un exercice de laboratoire fini fourni par MS a également l'erreur.

Est-ce que quelqu'un sait comment résoudre ce problème pour rendre le concepteur heureux?

Cheers,
Berryl

Répondre

4

problème ici est que vous utilisez Application.Current, qui est différent en mode Création et exécution. Lorsque vous ouvrez le concepteur, Application.Current ne sera pas votre classe "App" (ou peu importe comment vous l'appelez). Ainsi, il n'y a pas de propriété CurrentUser, et vous obtenez cette erreur.

Il y a plusieurs façons de le réparer. Le plus facile est de vérifier si vous êtes en mode de conception:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (Application.Current == null || 
     Application.Current.GetType() != typeof(App)) 
    { 
    // We are in design mode, provide some dummy data 
    return false; 
    } 

    var rating = (int)(values[0]); 
    var date = (DateTime)(values[1]); 

    // if the user has a good rating (10+) and has been a member for more than a year, special features are available 
    return _hasGoodRating(rating) && _isLongTimeMember(date); 
} 

Une autre approche ne serait pas en utilisant Application.Current comme source pour votre liaison.

Espérons que cela aide :).

+1

Spot sur. On peut se demander pourquoi les gens de MS n'ont pas pris la peine d'expliquer cela aussi bien que vous venez de le faire quand ils publient du matériel * learning *! À votre santé – Berryl

Questions connexes