5 Stimmen

Wie kann man die Eigenschaft ConverterParameter (oder eine andere) einer MultiBinding-Ressource (oder einer anderen Ressource) zur Laufzeit dynamisch ändern?

Ich bin neu in wpf und xaml. ich finde lösungen für die meisten probleme (in anderen sprachen), indem ich hier und da suche oder herumgoogle, aber dieses hier hat mich verrückt gemacht. ich habe viel bei google gesucht und viele foren durchstöbert, aber es scheint, dass ich dieses Mal auf eine echte herausforderung gestoßen bin!

Ich habe folgenden Code in Window.Resources:

<my:NameConverter x:Key="NameConverter"/>

<MultiBinding x:Key="CustomerFullNameBinding" 
              Converter="{StaticResource NameConverter}"
              ConverterParameter="LastNameFirst">
     <Binding Path="FirstName"  />
     <Binding Path="MiddleName" />
     <Binding Path="LastName" />
</MultiBinding>

El NameConverter Klasse gibt den vollständigen Namen zurück, indem sie einzelne Teile des Namens kombiniert. Der Rückgabewert basiert auf dem Wert von KonverterParameter der einer der folgenden sein kann: VornameVorname, NachnameVorname, NurVorname, NurNachname, Initialen (es gibt noch einige mehr, aber der Einfachheit halber lassen wir sie hier außer Acht)

Dieser Code funktioniert gut. Ich verwende Folgendes, um das Ergebnis zu erhalten:

<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>

Das Problem ist jedoch, dass ich, wenn ich die Ressource CustomerFullNameBinding 20 Mal in meinem Code (wie oben gezeigt) würden alle von ihnen den Namen in EINEM bestimmten Format anzeigen. (d.h. hier in der Deklaration von CustomerFullNameBinding habe ich KonverterParameter="NachnameVorname" daher werden alle 20 Referenzen nur auf diese Weise angezeigt).

Jetzt ist meine Frage kann ich es mehr "verallgemeinert", so dass die ich den Wert von setzen kann KonverterParameter dynamisch? d.h. ich kann mehrere Textblöcke haben, die den vollen Namen in verschiedenen Formaten anzeigen können. Ich weiß, dass es möglich ist, wenn wir mehrere Ressourcen wie folgt erstellen:

 <MultiBinding x:Key="CustomerFullNameBinding_FirstNameFirst" 
               Converter="..." ConverterParameter="FirstNameFirst">
      ......
 </MultiBinding>
 <MultiBinding x:Key="CustomerFullNameBinding_LastNameFirst" 
               Converter="..." ConverterParameter="LastNameFirst">
      ......
 </MultiBinding>
 <MultiBinding x:Key="CustomerFullNameBinding_OnlyFirstName" 
               Converter="..." ConverterParameter="OnlyFirstName">
      ......
 </MultiBinding>

 ... and so on ...

Aber ich will nicht, dass, 'coz es wirklich meinen Code zu sperrig machen, und vor allem wird es Konzept der Wiederverwendbarkeit von Ressourcen entwerten!

Bitte schlagen Sie mir eine mögliche Lösung vor.
Vielen Dank im Voraus.

Anmerkung: Die ursprüngliche Idee habe ich von aquí . Ein ähnliches Arbeitsbeispiel finden Sie unter msdn.microsoft.com/de-us/library/ms771336.aspx.

Tags: wpf xaml statischeRessource dynamischeRessourcenbindung

3voto

Joel B Fant Punkte 23946

Um den Anzeigemodus für jede Instanz ändern zu können, hätte ich es etwa so gemacht:

  • Erstellen einer UserControl mit 3 TextBlock s für die Anzeige der 3 Teile des Namens.
  • Fügen Sie Eigenschaften für die Teile des Namens hinzu, die Ziel der Bindung sein sollen.
  • Fügen Sie eine Eigenschaft für den Modus hinzu, in dem angezeigt werden soll ( VornameZuerst , NachnameVorname , usw.)

Die obigen Ausführungen erfordern eine Bindung für jeden Teil des Namens, so dass eine Möglichkeit zur Vereinfachung darin bestünde, eine einzige Eigenschaft der UserControl von einer Art NameData deklariert als Struktur mit First , Middle y Last Eigenschaften. Dann könnten Sie immer noch eine einzige MultiBinding zu dieser Eigenschaft. Der Unterschied wäre, dass Ihr NameConverter würde die 3 Teile nehmen und eine neue NameData struct anstelle einer formatierten Zeichenkette.

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" />

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" />

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" />

<!-- and so on... -->

Es geht darum, die Formatierung von den Daten zu entkoppeln.

Der Teil, der die Sache verkompliziert hat, war die Erklärung, dass eine MultiBinding als Ressource. Normalerweise würde es eine MultiBinding an jedem TextBlock an die Sie gebunden sind, damit Sie die ConverterParameter für jeden Fall.

Editar: Ich weiß, dass Sie die Möglichkeit haben wollten, sich zu ändern. ConverterParameter aber das ist nicht wirklich möglich, da es nur 1 Instanz von MultiBinding y ConverterParameter eine einfache Eigenschaft ist und nicht eine DependencyProperty die das Ziel einer DynamicResource o Binding .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X