Gibt es eine Möglichkeit, beliebige C # -Ausdrücke in XAML zu verwenden?

8

Ich möchte in der Lage sein, beliebige C # -Ausdrücke in XAML zu verwenden. Normalerweise würde dies eine Eigenschaft für ein UI-Element basierend auf zwei gebundenen Werten berechnen.

Zum Beispiel Berechnung der Breite eines UI-Elements basierend auf zwei anderen Eigenschaften.

Dies ist ein künstliches Beispiel dafür, wie der XAML aussehen soll:

%Vor%

Natürlich gibt es keine eingebaute Möglichkeit, dies in XAML zu tun.

Ich weiß, dass ich ein MultiBinding in Kombination mit einem benutzerdefinierten Konverter verwenden könnte, und das ist normalerweise die Art, wie ich diese Art von Dingen mache. Es scheint mir jedoch so viel einfacher zu sein, einfach einen C # -Code in das XAML aufzunehmen, und ich frage mich, ob jemand da draußen dieses Problem bereits mit einer XAML-Erweiterung oder etwas anderem gelöst hat.

    
Ashley Davis 03.12.2010, 13:51
quelle

5 Antworten

2

Sie betten C # -Code wie folgt in XAML ein:

%Vor%

Aber dieser Ansatz wird überhaupt nicht empfohlen, weil er die reine Präsentationsebene mit Geschäftslogik mischt.

    
Liviu M. 03.12.2010 13:55
quelle
2

Ich habe benutzerdefinierte Xaml-Konverter gesehen, die IronPython-Code und Invoke DLR verwenden. Es ist nicht ganz C #, aber es ist sicherlich weniger hässlich als die Verwendung von [CDATA] -Tags.

Ссылка

Dies ist der Link zu einem Open-Source-Projekt zu diesem Thema.

    
Michael B 03.12.2010 13:56
quelle
1

Bitte beachten Sie das mit dem Code wie

%Vor%

Es ist besonders schwer (obwohl es nicht völlig unmöglich ist, Linq-Ausdrücke im Hinterkopf zu behalten), den Wert neu zu bewerten, sobald sich einige der Operanden ändern. Die automatische Aktualisierung des Zielwerts bei einer Quelländerung ist einer der Hauptvorteile von WPF-Bindungen.

    
Vlad 03.12.2010 13:59
quelle
1

Umbrechen Sie Ihren Ausdruck in eine öffentliche Eigenschaft und binden Sie ihn an diese Eigenschaft.

In C # -Codebehind:

%Vor%

In XAML:

%Vor%     
VVS 03.12.2010 14:22
quelle
0

Ich habe jetzt eine Antwort auf meine Frage. Es ist nicht die Antwort, die ich ursprünglich gesucht habe, und es ist ein bisschen langatmig, aber es funktioniert.

Ich habe diesen Beitrag von Josh Smith gelesen. Er empfiehlt, keine Wertkonverter zu verwenden, sondern die Berechnungen nach unten in das Ansichtsmodell zu schieben und sie als Eigenschaft auszusetzen:

Ссылка

In meinem Fall sollte der Text für 'textBox1' und 'textBox2' in das View-Modell eingebunden werden. Wenn sie sich im View-Modell ändern, weiß ich, wie viel Zeit für die Berechnung und die Aktualisierung der abhängigen Eigenschaft zur Verfügung steht. Die abhängige Eigenschaft löst dann das Ereignis "Eigenschaft geändert" aus, und die Benutzeroberfläche wird aktualisiert.

Wenn Sie einen Fall haben, in dem Sie möchten, dass der Ausdruck von schreibgeschützten Steuerelementeigenschaften abhängt, die Sie nicht einfach an das Ansichtsmodell binden können, können Sie dem folgenden Ratschlag folgen:

Read-only-GUI-Eigenschaften zurück in ViewModel schieben

Ich möchte immer noch die Möglichkeit haben, Ausdrücke (Nicht-Geschäftslogik) in XAML einzubetten. Aber da dies nicht eingebaut ist, ist es wahrscheinlich ein bisschen ein Hack. Das View-Modell zu durchlaufen, scheint der richtige Weg zu sein, aber vielleicht experimentiere ich eines Tages mit dem Schreiben einer Markup-Erweiterung, die den Ausdruck in XAML erlaubt.

    
Ashley Davis 14.12.2010 17:03
quelle

Tags und Links