WPF Associazione dati con errori IMultiValueConverter e di colata
-
16-09-2019 - |
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
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:)
.