none
Wie referenziere ich ein Code-behind property in XAML? RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein Property in code-behind von a Window-Klasse MainWindow definiert:
    private string TestProperty
    { get {return "Hallo"} }
    und möchte nun das im selben Window-Klasse von einem XAML-Element referenzieren:
    <TextBox Text= .... />

    Einziges was ich gefunden habe ist Binding über RelativeSource:
                       <TextBox>
                            <TextBox.Text>
                                <Binding  Path="TestProperty">
                                    <Binding.RelativeSource>
                                        <RelativeSource Mode="FindAncestor" AncestorType="{x:Type Window}"/>
                                    </Binding.RelativeSource>
                                </Binding>
                            </TextBox.Text>
                        </TextBox>

    Das ist in diesem Fall etwas übertrieben, da sich BindingSource ja nie ändert.
    Wenn TestProperty als static deklriert wäre, könnte man ohne Binding auskommen:
    <TextBox Text= {x:Static local:MainWindow.TestProperty}/>

    Gibt's doch vielleicht eine ähnlich einfache Lösung für Instanzproperties?

    Gruß
    Efim

    Freitag, 20. November 2009 11:19

Antworten

  • Hallo Efim45,

    du kannst nur auf public Properties binden.

    Wenn du den DataContext von MainWindow auf this setzt brauchst du keine RelativeSource nur die normale Binding.

    C#:
    ...
    this.DataContext = this;

    ...
    public string TextProperty { get; set; }

    XAML:

    <TextBox Text={Binding TestProperty} />

    Du brauchst auch einen Setter, sonst kann die TextBox ja nichts zurückschreiben. Wenn du den Setter weglässt musst du beim Binden dann Mode=OneWay
    einstellen sonst bekommst du eine Exception.

    Hope that helps
    Freitag, 20. November 2009 23:51

Alle Antworten

  • Hallo Efim45,

    du kannst nur auf public Properties binden.

    Wenn du den DataContext von MainWindow auf this setzt brauchst du keine RelativeSource nur die normale Binding.

    C#:
    ...
    this.DataContext = this;

    ...
    public string TextProperty { get; set; }

    XAML:

    <TextBox Text={Binding TestProperty} />

    Du brauchst auch einen Setter, sonst kann die TextBox ja nichts zurückschreiben. Wenn du den Setter weglässt musst du beim Binden dann Mode=OneWay
    einstellen sonst bekommst du eine Exception.

    Hope that helps
    Freitag, 20. November 2009 23:51
  • Hallo Günter,

    sorry für zu Spätsein mit meiner Reaktion und danke für den Hinweis auf DataContext-Löasung.

    Ich frage mich aber grundsätzlich ob es ohne Binding geht, ähnlich zu static properties über eine Markup-Extension. Dann wäre es auch mit private Properties möglich gewesen was aus meiner Sicht innerhalb einer Klasse ganz legitim sein müsste. Oder sehe ich das grundlegend falsch?

    Efim
    Mittwoch, 10. Februar 2010 18:42