Laden...

[erledigt] Binding Path=xy, Source{x:Static App.Current} - Bindung zu Property schlägt fehl

Erstellt von Amosius vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.872 Views
A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren
[erledigt] Binding Path=xy, Source{x:Static App.Current} - Bindung zu Property schlägt fehl

Hallo, ich seh gerade den Wald vor lauter Bäume nicht....

Ich habe ein Binding in XAML das auch funktioniert
Geht:

... Title="{Binding strName}" > 

ich habe ein Datacontext erstellt und so funktioniert die Bindung auch.

Aufgrund eines Frameworks, welches mir empfiehlt aus Buggründen die vollständige Definition in XAML vorzunehmen, möchte ich die Bindung nun umstellen auf XAML und habe folgendes Ziel (war als Beispiel dabei)
Beispiel:

ItemsSource="{Binding Path=MainWindow.SampleCollection, Source={x:Static local:App.Current}

Nun möchte ich das analog für mein Binding erstellen.

Ich habe ein Editor.xaml und ein Editor.xaml.cs.
Im Editor.xaml.cs ist folgendes Element der Klasse Kontakt:

Kontakt MeinKontakt = new Kontakt("Müller");

Nun möchte ich auf diesen Namen per Binding zurückgreifen, analog dem oben erwähnten Code mit "Source=..."

Ich würde nun soetwas vermuten, aber da irre ich mich.
Geht nicht:

...Title="{Binding Editor.Kontakt.strName, Source={x:Static Application.Current}}" >
3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Amosius,

Aufgrund eines Frameworks, welches mir empfiehlt aus Buggründen die vollständige Definition in XAML vorzunehmen, möchte ich die Bindung nun umstellen auf XAML und habe folgendes Ziel (war als Beispiel dabei)

Was hast du denn da für ein komisches Framework? 😉

Schau dir mal das MVVM Pattern an. Dort ist es der übliche Weg über den DataContext an ein ViewModel zu binden.

Guckst du hier: WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster
Also Framework kann ich dir Cinch oder Caliburn empfehlen

Gruss
Michael

A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren

Hallo Michael,

das MVVM Pattern versuche ich anzuwenden 😃

Cinch und Caliburn kannte ich nicht. Schau ich mir mal an.

Für einen konkreten Fall möchte ich gerne das Binding komplett in XAML vornehmen.
Folgendes Statement wird zwar kompiliert, aber ich erhalte noch nicht das Binding:

Title="{Binding Path=MeineKlasse.MeineEigenschaft, Source={x:Static MeinNamespace:App.Current}}"

Kann das überhaupt so gehen?

5.658 Beiträge seit 2006
vor 13 Jahren

Heißt es nicht "Source={x:Static MeinNamespace:Application.Current}}"?

Weeks of programming can save you hours of planning

A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren

Bei mir nicht.... mit Application.Current erhalte ich ne Fehlermeldung:

Fehler 1 Der Typ "Application"wurde nicht gefunden. Beachten Sie, dass bei Typnamen die Groß- und Kleinschreibung berücksichtigt wird.

Mit Appl.Current geht es. Ich habe aber z.T. gelesen dass manche Application.Current verwenden. Kann also sein dass das bei dir geht 😃

Bei mir schluckt er zwar Appl.Current, aber leider erhalte ich nicht das gewünschte Ergebnis. Bin nicht sicher ob ich da noch nen grösseren Denkfehler habe....

5.658 Beiträge seit 2006
vor 13 Jahren

Ok, ich nehm's zurück. Hast du evtl. vor, eine Anwendung mit AvalonDock zu erstellen? Dann solltest du dir das hier mal anschauen: http://avalondock.codeplex.com/wikipage?title=AvalonDock%20Binding&referringTitle=Documentation
Jedenfalls erinnerte mich der Hinweis auf das "komische Framework" gerade daran.

Geht nicht:

...Title="{Binding Editor.Kontakt.strName, Source={x:Static App.Current}}" >  

Du mußt uns unbedingt sagen, was daran nicht geht, siehe auch [Hinweis] Wie poste ich richtig?, Punkt 5. Im Grunde kann es mehrere Ursachen haben, aber ohne Fehlermeldungen kann man halt nichts genaues sagen.

Weeks of programming can save you hours of planning

A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren

Hallo MrSparkle,

ja genau, um das Avalon-Dock Framework geht es. Ich habe einige Bindings bei mir die ich nach der Anleitung umstellen möchte. Eine Fehlermeldung erhalte ich nicht.

Ich möchte gerne den Titel des Avalon-Dock Fensters an eine Variable binden.
Das hat auch so funktioniert:

.. Title="{Binding strKontaktName}"

Den DataContext setze ich im Code:

KontaktDetails.Datacontext = MeineKontakte;

Das Framework hat aber das Problem, dass bei einer abkopplung der Datacontext verloren geht, es verschwindet also der Name. Der Titel ist nach Abkopplung leer. Als Lösung ist vorgeschlagen, das Binding komplett in XAML durchzuführen.

Meines erachtens muss ich Klassenname, Objektname und Eigenschaft mitgeben. Mache ich das nach folgendem Schema ist der Titel nicht nur nach der Abkopplung leer, sondern von Anfang an. D.h. das Binding kann kein einziges mal erfolgen.

Title="{Binding Path=<Klassenname>.<Objektname>.<Eigenschaft>, Source={x:Static App.Current}}"

Eine Fehlermeldung wie gesagt wird nicht produziert, die Anwendung startet aber der Titel wird nicht gesetzt und ist leer.

5.658 Beiträge seit 2006
vor 13 Jahren

Ich glaube, da hast du was falsch verstanden. Im Path wird nicht der Klassenname, sondern der Name des Members in App.Current angebenen. In den Beispielen wird die Eigenschaft MainWindow verwendet.

Die Fehler, die beim Binding wärend der Laufzeit entstehen, werden im Ausgabe-Fenster angezeigt, dort mußt du immer nachschauen.

Weeks of programming can save you hours of planning

A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren

Hallo MrSparkle,

vielen Dank. Ich lerne die Zusammenhänge und die gegenseitigen Referenzierungen besser zu verstehen.

Ich teile aktuellen Stand mit, bin für jeden Hinweis dankbar.

Im Objekt App.cs habe ich folgendes definiert:

<Application x:Class="Kontaktanwendung.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:pm="clr-namespace:Kontakte"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="Kontakt.xaml">
    <Application.Resources>
    </Application.Resources>
</Application>

Der Anfang der XAML Datei ist wie folgt aufgebaut (sollte so stimmen):

<r:RibbonWindow 
    Name="rwKontakte"
    x:Class="Kontakte.Kontakt"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
....

Das Binding wird wie folgt definiert:


Title="{Binding Path=strKontaktName, Source={x:Static pm:App.Current}}"

In der Datei Kontakt.xaml.cs habe ich eine Klasse Kontakt.
In dieser ist Testweise folgendes definiert:

public string strKontaktName = "Müller";

In der Ausgabe wird aufgeführt, dass das Objekt nicht gefunden wird:

 System.Windows.Data Error: 40 : BindingExpression path error: 'strKontaktName' property not found on 'object' ''App' (HashCode=63433729)'. BindingExpression:Path=strKontaktName; DataItem='App' (HashCode=63433729) 
5.299 Beiträge seit 2008
vor 13 Jahren

naja, strKontaktName ist ja auch keine Property, sondern ein Feld.

Ich denke, wenn solche Grundlagen fehlen, sollteste mal nach einem guten Buch über die Grundlagen von c# Ausschau halten.

Der frühe Apfel fängt den Wurm.

A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren

Hallo ErfinderDesRades. Vielen Dank, konnte nun gelöst werden. Ich versuche die Qualität meiner Fragen zu erhöhen 🙂 und schliesse den Beitrag.

5.658 Beiträge seit 2006
vor 13 Jahren

Funktioniert es denn jetzt? Meiner Meinung nach müßte das Binding so aussehen:

Title="{Binding Path=Kontakt.strKontaktName, Source={x:Static pm:App.Current}}"

Natürlich vorrausgesetzt, du konvertierst das Feld in eine Eigenschaft:


public string strKontaktName { get; set; }

Christian

Weeks of programming can save you hours of planning

A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren

Hallo Christian,

danke für die Nachfrage.

Ich bin noch am experimentieren und einlesen.
Ich habe das Property in der Klasse App.cs definiert.
Das Binding mit folgendem Code funktinioniert:

Title="{Binding Path=strKontaktName, Source={x:Static pm:App.Current}}"

Das Property in der der Datei Kontakt.xaml.cs mit der Klasse Kontakt und
folgendes Binding:

Title="{Binding Path=Kontakt.strKontaktName, Source={x:Static pm:App.Current}}"

oder Alternativ:

Title="{Binding Path=Kontakt.strKontaktName, Source={x:Static pm:App.Current}}"

geht zwar noch nicht. Aber ich forste mal weiter. Die Denkanstösse fand ich schon gut
und mit jedem Tag verfliegt ja etwas Nebel und die Zusammenhänge werden klarer.

5.658 Beiträge seit 2006
vor 13 Jahren

Wenn du das Property in der Application-Klasse definiert hast, ist das erste Binding auch korrekt. Aber ungewöhnlich ist es schon, wieso definierst du das Property nicht in deiner ViewModel-Klasse und erstellst davon eine Instanz in der App.xaml?

Weeks of programming can save you hours of planning