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

Était-ce utile?

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:)

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top