WPF liaison de données en utilisant les erreurs de IMultiValueConverter et de coulée
-
16-09-2019 - |
Question
Dans le cadre de l'apprentissage WPF Je viens de terminer un travail dans l'exercice MS Lab appelé « Utilisation des données de liaison dans WPF » ( http://windowsclient.net/downloads/folders/hands-on-labs/entry3729.aspx ).
Pour illustrer l'utilisation d'un IMultiValueConverter, il y a une application de pré-codée de celui où le résultat booléen est utilisé pour déterminer si les données de liaison est pertinent pour l'utilisateur actuel. Voici le code pour l'opération de conversion:
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 « cast spécifié non valide. » Erreur. J'ai essayé deux façons de ne pas utiliser un casting, un dont je quitté décommentée dans le code ci-dessus. La chose drôle est un exercice de laboratoire fini fourni par MS a également l'erreur.
Quelqu'un sait comment résoudre pour rendre le concepteur heureux?
Cheers,
Berryl
La solution
Le problème est ici que vous utilisez Application.Current, qui est différent en mode Création et exécution.
Lorsque vous concepteur ouvert, Application.Current ne sera pas votre classe « App » (ou tout ce que vous nommez). Ainsi, il n'y a pas de propriété CurrentUser là-bas, et votre obtenir cette erreur.
Il y a plusieurs façons d'y remédier. 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 serait de ne pas utiliser Application.Current comme source pour votre liaison.
Hope this helps:)
.