Domanda

Come parte di apprendimento WPF ho appena finito di lavorare attraverso un MS Lab esercizio chiamato "Utilizzo Associazione dati in WPF" ( http://windowsclient.net/downloads/folders/hands-on-labs/entry3729.aspx ).

Per illustrare utilizzando un IMultiValueConverter, v'è un'implementazione pre-codificati di uno in cui il risultato booleano viene utilizzato per determinare se l'associazione dati è rilevante per l'utente corrente. Ecco il codice per l'operazione di convertire:

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);
    }

E qui viene il cablaggio di utilizzare questo nel 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>

Il codice viene eseguito bene, ma il designer XAML non verrà caricato con un "cast specificato non è valido." errore. Ho provato un paio di modi non utilizzare per un cast, uno dei quali ho lasciato senza commenti nel codice sopra. La cosa divertente è un esercizio di laboratorio finito fornito da MS ha anche l'errore.

Qualcuno sa come risolvere il problema di rendere il progettista felice?

Saluti,
Berryl

È stato utile?

Soluzione

problema qui è che si utilizza Application.Current, che è diverso nella modalità di progettazione e in fase di esecuzione.

Quando si apre progettista, Application.Current non sarà la tua classe "App" (o qualsiasi altra cosa è il nome). Così ci sono alcuna proprietà CurrentUser lì, e il vostro ottenere tale errore.

Ci sono diversi modi per risolvere il problema. Quella più semplice è quello di verificare se si è in modalità di progettazione:

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);
}

Un altro approccio sarebbe non utilizzare Application.Current come fonte per il vostro legame.

Spero che questo aiuti:)

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top