Frage

Im Rahmen WPF das Lernen Ich habe gerade arbeiten durch eine MS Lab-Übung „Verwenden von Datenbindung in WPF“ ( http://windowsclient.net/downloads/folders/hands-on-labs/entry3729.aspx ).

So veranschaulichen eine IMultiValueConverter verwenden, gibt es eine vorcodierte Implementierung einer wo das Boolesche Ergebnis verwendet wird, um zu bestimmen, ob die relevanten Daten für den aktuellen Benutzer bindend ist. Hier ist der Code für die Umwandlungsoperation:

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

Und hier ist die Verkabelung dieses in der XAML zu verwenden:

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

Der Code läuft gut, aber der XAML-Designer wird nicht mit einer Last „den angegebenen Ziel ungültig.“ Error. Ich habe versucht, ein paar Möglichkeiten, um nicht eine Besetzung zu verwenden, von denen ich oben im Code unkommentiert gelassen. Das Komische ist, ein fertiges Labor Übung zur Verfügung gestellt von MS auch den Fehler hat.

Wer weiß, wie es mit den Designern glücklich zu machen?

Cheers,
Berryl

War es hilfreich?

Lösung

Problem hier ist, dass Sie verwenden Application.Current, die im Designmodus und im laufenden Betrieb unterschiedlich ist.

Wenn Sie öffnen Designer, Application.Current Ihre „App“ Klasse nicht (oder was auch immer Sie es nennen). So gibt es dort keine Current Eigenschaft, und Sie diesen Fehler erhalten.

Es gibt mehrere Möglichkeiten, es zu beheben. Am einfachsten ist zu überprüfen, ob Sie im Entwurfsmodus sind:

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

Ein weiterer Ansatz wäre nicht Application.Current als Quelle verwendet für Ihre Bindung.

Hope, das hilft:)

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top