Es fällt mir schwer, eine einfache statische Zeichenfolge an eine TextBox zu binden.
Hier ist die Klasse mit der statischen Eigenschaft:
public class VersionManager
{
private static string filterString;
public static string FilterString
{
get { return filterString; }
set { filterString = value; }
}
}
In meinem xaml möchte ich diese statische Eigenschaft nur an eine TextBox binden:
<TextBox>
<TextBox.Text>
<Binding Source="{x:Static local:VersionManager.FilterString}"/>
</TextBox.Text>
</TextBox>
Alles wird kompiliert, aber zur Laufzeit erhalte ich die folgende Ausnahme:
Der Wert im Attribut 'Source' kann nicht in ein Objekt vom Typ 'System.Windows.Markup.StaticExtension' konvertiert werden. Fehler am Objekt 'System.Windows.Data.Binding' in der Markup-Datei 'BurnDisk; component / selectversionpagefunction.xaml' Zeile 57 Position 29.
Irgendeine Idee, was ich falsch mache?
quelle
Sie können sich nicht an eine solche Statik binden. Es gibt keine Möglichkeit für die Bindungsinfrastruktur, über Aktualisierungen benachrichtigt zu werden, da keine
DependencyObject
(oder implementierte ObjektinstanzINotifyPropertyChanged
) beteiligt ist.Wenn sich dieser Wert nicht ändert, lassen Sie die Bindung einfach fallen und verwenden Sie sie
x:Static
direkt in derText
Eigenschaft. Definieren Sieapp
unten den Namespace- (und Assembly-) Speicherort der VersionManager-Klasse.Wenn sich der Wert ändert, würde ich vorschlagen, einen Singleton zu erstellen, der den Wert enthält, und an diesen zu binden.
Ein Beispiel für den Singleton:
quelle
In .NET 4.5 ist es möglich, an statische Eigenschaften zu binden. Lesen Sie mehr
quelle
Ab WPF 4.5 können Sie direkt an statische Eigenschaften binden und die Bindung automatisch aktualisieren lassen, wenn Ihre Eigenschaft geändert wird. Sie müssen ein Änderungsereignis manuell verkabeln, um die Bindungsaktualisierungen auszulösen.
Sie können Ihre statische Eigenschaft jetzt wie jede andere binden:
quelle
VersionManager
Klasse kann statisch sein und alles funktioniert noch. Beachten Sie die geschweiften Klammern in der PfaddefinitionPath=(local:VersionManager.FilterString)
. Weiß jemand, warum sie tatsächlich gebraucht werden?Es gibt zwei Möglichkeiten / Syntax, um eine
static
Eigenschaft zu binden . Wenn p einestatic
Eigenschaft in der Klasse istMainWindow
, lautetbinding
fortextbox
:1.
2.
quelle
Sie können
ObjectDataProvider
class und seineMethodName
Eigenschaft verwenden. Es kann so aussehen:Der deklarierte Objektdatenanbieter kann folgendermaßen verwendet werden:
quelle
Wenn Sie lokale Ressourcen verwenden, können Sie diese wie folgt verwenden:
quelle
Richtige Variante für .NET 4.5 +
C # -Code
XAML-Bindung (Aufmerksamkeit auf geschweifte Klammern (), nicht {})
quelle
Schauen Sie sich mein Projekt CalcBinding an , mit dem Sie komplexe Ausdrücke in den Eigenschaftenwert Path schreiben können, einschließlich statischer Eigenschaften, Quelleneigenschaften, Mathematik und anderer. Sie können also Folgendes schreiben:
Viel Glück!
quelle
Diese Antworten sind alle gut, wenn Sie gute Konventionen befolgen möchten, aber das OP wollte etwas Einfaches , was ich auch wollte, anstatt mich mit GUI-Entwurfsmustern zu befassen. Wenn Sie lediglich eine Zeichenfolge in einer einfachen GUI-App haben möchten, die Sie ad-hoc aktualisieren können, ohne etwas Besonderes zu tun, können Sie direkt in Ihrer C # -Quelle darauf zugreifen.
Angenommen, Sie haben eine wirklich einfache WPF-App wie MainWindow XAML.
Das wird ungefähr so aussehen:
In der Quelle Ihres MainWindow XAML könnten Sie so etwas haben, wo wir alles tun, um den Wert direkt über
textBlock.Text
'sget
/set
Funktionalität zu ändern :Wenn Sie dann dieses Klickereignis durch Klicken auf die Schaltfläche auslösen, wird voila! Kilroy erscheint :)
quelle
Eine andere Lösung besteht darin, eine normale Klasse zu erstellen, die PropertyChanger wie folgt implementiert
Erstellen Sie dann eine statische Instanz der Klasse an einer Stelle, die Sie nicht möchten
Und jetzt verwenden Sie es als statische Eigenschaft
Und hier ist bei Bedarf die Implementierung von PropertyChanger
quelle
Schlankste Antwort (.net 4.5 und höher):
und XAML:
Vernachlässigen Sie nicht die Klammern
quelle