ausgewählte Charaktere Dialog
3 verfasser
Seite 1 von 1
ausgewählte Charaktere Dialog
hallo zusammen.
wo werden denn eigentlich die zugehörigen charaktere des dialogs gespeichert? müssen wissen, woran wir die combobox im textfenster binden.
bisher kein plan.
wo werden denn eigentlich die zugehörigen charaktere des dialogs gespeichert? müssen wissen, woran wir die combobox im textfenster binden.
bisher kein plan.
Tobias G.- Anzahl der Beiträge : 37
Anmeldedatum : 23.10.12
Re: ausgewählte Charaktere Dialog
Jeder geöffnete Dialog wird ja in einer TextEditorVM geladen, diese enthält eine ObservableCollection "invCharacters" , die alle zum Dialog gehörenden Charaktere vom Typ T_Character enthält.
Die TextLineVM die ja für jede Textline da sind haben eine Property "speaker", die das jeweils ausgewählte Objekt enthalten soll (soviel zur Theorie). Ich bin noch nich ganz sicher wie wir das am geschicktesten binden, da eine combobox möglicherweise so wie eine Listbox nur einen SelectedIndex enthält. Könnte aber trotzdem irgendwie klappen tatsächlich das ausgewählte Element zu binden, aber falls es da scheitert sagt bescheid, dann denken wir uns etwas aus.
Die TextLineVM die ja für jede Textline da sind haben eine Property "speaker", die das jeweils ausgewählte Objekt enthalten soll (soviel zur Theorie). Ich bin noch nich ganz sicher wie wir das am geschicktesten binden, da eine combobox möglicherweise so wie eine Listbox nur einen SelectedIndex enthält. Könnte aber trotzdem irgendwie klappen tatsächlich das ausgewählte Element zu binden, aber falls es da scheitert sagt bescheid, dann denken wir uns etwas aus.
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
Habe jetzt mehrer Möglichkeiten ausprobiert die ComboBox an die Charaktere zu binden. Bisher ohne Erfolg.
1.
da wir uns durch die ListBox im DataContext der TextLineVM befinden brauch es hier keine weitere Pfadangabe
2.
Das wiederrum referenziert das TextEditorVM Objekt das in der nächsthöheren TabControl definiert wird. Dort liegt die Liste mit den teilnehmenden Charakteren.
Wenn noch jemand ne Idee hat ich jetzt grade nicht.
1.
- Code:
<ComboBox ItemsSource="{Binding Speaker}"/>
da wir uns durch die ListBox im DataContext der TextLineVM befinden brauch es hier keine weitere Pfadangabe
2.
- Code:
<ComboBox ItemsSource="{Binding DataContext.InvCharacter, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}
SelectedItem={Binding name}"/>
Das wiederrum referenziert das TextEditorVM Objekt das in der nächsthöheren TabControl definiert wird. Dort liegt die Liste mit den teilnehmenden Charakteren.
Wenn noch jemand ne Idee hat ich jetzt grade nicht.
Tobias Stein- Anzahl der Beiträge : 88
Anmeldedatum : 23.10.12
Re: ausgewählte Charaktere Dialog
Bin gradnoch nicht zuhause, schaue später nochmalnach ich meine aber dass invcharacters vom typ CharacterVM ist, dh binding Name (groß geschrieben). Binding speaker klappt nich weil speaker genau das ausgewählte element enthalten soll, nicht die liste. Ich denke dass wir dafür n icommand binden müssen der dann ne funktion zum speichern aufruft oder wir kriegen ne andere variable hin die den index des ausgewählten charakters aus der invcharacters liste enthält, falls sich das binden lässt. Dann würden wir speaker intern manuell füllen können.
Alle angaben ohne gewähr ich versuch da heute abend noch mehr infos zu kriegen...
Alle angaben ohne gewähr ich versuch da heute abend noch mehr infos zu kriegen...
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
OK jetz zuhause mit projekt vor der Nase.
invCharacters is vom Typ T_Character (zumindest zum jetzigen zeitpunkt). das heißt das Binding sollte korrekterweise auf name gehen. Allerdings klappt das nicht so wie in deinem 2. code, weil du das SelectedItem auf den namen bindest. (ansonsten sieht das aber nach nem brauchbaren ansatz aus).
Ich hab soeben eine neue Property zur TextLineVM eingefügt (als provisorium zum testen). Diese heißt "SpeakerIndex" und ist ein integer. Ich gehe stark davon aus, dass ihr DAS jetzt an SelectedItem binden könnt, und somit die Auswahl in der Combobox an die VM geleitet werden kann (wir werden uns dann fürs backend überlegen wie wir weiter damit hantieren, denn wenn man die Charakterliste bearbeitet, könnten da inkonsistenten entstehen.)
In diesem Zuge eine Frage die auch die Konzeptgruppe interessieren dürfte (bevor es später erst als bug auftaucht):
Was ist die Charakterauswahl, wenn eine Zeile einem Charakter zugehörig ist, der anschließend aus der liste der beteiligten Charaktere gelöscht wird? (immer der erste charakter, brauchen wir eine "Bitte Charakter Wählen"-Zeile in der involvedListe, etc etc)
Was das grundlegende Binding an die invCharacters Liste angeht, so braucht ihr ein Datatemplate, das jede einzelne Zeile der Combobox definiert (ist im mainwindow bereits mehrfach vorhanden glaube ich, sollte also simpel sein). Dieses Datatemplate definiert dann wie die Elemente der Combobox (die ja vom Typ T_Character sind) angezeigt werden, und sollten dann n Textlabel enthalten das an name gebunden ist. so ca.
Hoffe das hilft. Weitere fragen immer her
invCharacters is vom Typ T_Character (zumindest zum jetzigen zeitpunkt). das heißt das Binding sollte korrekterweise auf name gehen. Allerdings klappt das nicht so wie in deinem 2. code, weil du das SelectedItem auf den namen bindest. (ansonsten sieht das aber nach nem brauchbaren ansatz aus).
Ich hab soeben eine neue Property zur TextLineVM eingefügt (als provisorium zum testen). Diese heißt "SpeakerIndex" und ist ein integer. Ich gehe stark davon aus, dass ihr DAS jetzt an SelectedItem binden könnt, und somit die Auswahl in der Combobox an die VM geleitet werden kann (wir werden uns dann fürs backend überlegen wie wir weiter damit hantieren, denn wenn man die Charakterliste bearbeitet, könnten da inkonsistenten entstehen.)
In diesem Zuge eine Frage die auch die Konzeptgruppe interessieren dürfte (bevor es später erst als bug auftaucht):
Was ist die Charakterauswahl, wenn eine Zeile einem Charakter zugehörig ist, der anschließend aus der liste der beteiligten Charaktere gelöscht wird? (immer der erste charakter, brauchen wir eine "Bitte Charakter Wählen"-Zeile in der involvedListe, etc etc)
Was das grundlegende Binding an die invCharacters Liste angeht, so braucht ihr ein Datatemplate, das jede einzelne Zeile der Combobox definiert (ist im mainwindow bereits mehrfach vorhanden glaube ich, sollte also simpel sein). Dieses Datatemplate definiert dann wie die Elemente der Combobox (die ja vom Typ T_Character sind) angezeigt werden, und sollten dann n Textlabel enthalten das an name gebunden ist. so ca.
Hoffe das hilft. Weitere fragen immer her
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
Nee das geht auch nicht, glaube aber das die Ursache woanders liegt da ich theoretisch auch nur innerhalb der TextEditor bleiben kann, da liegen ein paar dummy charactere.Aber auch da tut sich nix
Tobias Stein- Anzahl der Beiträge : 88
Anmeldedatum : 23.10.12
Re: ausgewählte Charaktere Dialog
wenn du innerhalb des texteditors bist, sollte alles klar gehn weil dann invcharacters die charaktere des dialogs enthält (sollte sogar funktional sein daher bräuchten wir keine dummy chars)...
Das SelectedItem hingegen müsste dann wieder innerhalb der textline liegen.
Eine Notlösung wäre jeder TextlineVM die invcharactersliste zu geben ich glaube aber ehrlich gesagt nicht dass das notwendig ist.
was habt ihr denn akkut ausprobiert? poste mal code zum drüberschauen...
Das SelectedItem hingegen müsste dann wieder innerhalb der textline liegen.
Eine Notlösung wäre jeder TextlineVM die invcharactersliste zu geben ich glaube aber ehrlich gesagt nicht dass das notwendig ist.
was habt ihr denn akkut ausprobiert? poste mal code zum drüberschauen...
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
http://social.msdn.microsoft.com/Forums/de-DE/wpfde/thread/8fc451d2-6bca-4229-ac37-94299ac65247
hab hier was gefunden das könnte hilfreich sein, wie man das bindet... nach dem schema wäre das "Name" dann auch unser T_Character.name, und statt einer numeric value die wir binden müssen, könnten wir versuchen das ganze t_character objekt an speaker zu binden, oder notfalls nehmen wir die character ID...
hab hier was gefunden das könnte hilfreich sein, wie man das bindet... nach dem schema wäre das "Name" dann auch unser T_Character.name, und statt einer numeric value die wir binden müssen, könnten wir versuchen das ganze t_character objekt an speaker zu binden, oder notfalls nehmen wir die character ID...
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
AAAALSO
die Gute Nachricht:
http://www.codeproject.com/Articles/301678/Step-by-Step-WPF-Data-Binding-with-Comboboxes
So wies aussieht haben wir selectedValuePath und SelectedValue womit wir das gewählte Element auswählen können.
Ich hab grad ma n bissl rumexperimentiert, es scheint dass euer RelativeSource im Binding nicht so funktioniert. Es scheint mir dass ihr so nur auf Elemente der TabControl, nicht aber auf die TextEditorVM kommt.
Ich muss leider jetz weg aber guck heut nacht nochma rein, das muss ja irgendwie möglich sein...
die Gute Nachricht:
http://www.codeproject.com/Articles/301678/Step-by-Step-WPF-Data-Binding-with-Comboboxes
- Code:
<ComboBox ItemsSource="{Binding ColorListEnum}"
DisplayMemberPath="ValueColorString"
SelectedValuePath="ValueColorEnum"
SelectedValue="{Binding ViewModelEnum.ColorEnum}" />
So wies aussieht haben wir selectedValuePath und SelectedValue womit wir das gewählte Element auswählen können.
Ich hab grad ma n bissl rumexperimentiert, es scheint dass euer RelativeSource im Binding nicht so funktioniert. Es scheint mir dass ihr so nur auf Elemente der TabControl, nicht aber auf die TextEditorVM kommt.
Ich muss leider jetz weg aber guck heut nacht nochma rein, das muss ja irgendwie möglich sein...
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
Die TabControl hat ja Die TextEditorVM gebunden durch
- Code:
ItemsSource ="{Binding TextEditors}"
Tobias Stein- Anzahl der Beiträge : 88
Anmeldedatum : 23.10.12
Re: ausgewählte Charaktere Dialog
- Code:
<ComboBox Grid.Column="0" Grid.Row="1" Width="70"
ItemsSource="{Binding DataContext.InvCharacter, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"
DisplayMemberPath="name"
SelectedValuePath="cid"
SelectedValue="{Binding cid}">
</ComboBox>
ok das habe ich jetzt probiert, allerdings glaube ich nicht das selectedValue einfach so auf die T_Character class zeigt
Ich habe das problem auch mal bei staticoverflow gepostet, mal gucken ob da jemand ne idee hat
Tobias Stein- Anzahl der Beiträge : 88
Anmeldedatum : 23.10.12
Re: ausgewählte Charaktere Dialog
klappt das jetz dass die Charaktere in der Liste autauchen?
ansonsten is selectedvaluepath nicht die cid, sondern der charakter selber (ich vermute SelectedValuePath="this"?? auf jeden fall mit selbstreferenz)
dann wäre SelectedValue="{Binding speaker}"
so würden wir den tatsächlichen Charakter aus der Liste weitergeben...
ansonsten is selectedvaluepath nicht die cid, sondern der charakter selber (ich vermute SelectedValuePath="this"?? auf jeden fall mit selbstreferenz)
dann wäre SelectedValue="{Binding speaker}"
so würden wir den tatsächlichen Charakter aus der Liste weitergeben...
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
okay ich bin der Lösung des Rätsels etwas näher:
Ich habe mal getestet wie ich ZB an ein Textfeld innerhalb eines Listbox items (im datatemplate) den titel des dialogs binden könnte und folgendes gemacht:
Ich hab testweise dafür einfach das label genommen, das normalerweise den string "From:" enthält und siehe da: es klappt.
Was ich dadurch herausgefunden habe: Wir müssen als parent nicht TabControl oder TabItem binden sondern die ListBox. Offensichtlich hat also die ListBox als DataContext die TextEditorVM.
Als ich mal spaßeshalber den Title an die Combobox gebunden habe waren auf einmal seeehr viele items in der combobox, also wurden offenbar die einzelnen Buchstaben aufgelistet (nur nicht angezeigt)...
Problem: wenn ich jetzt im selben DataContext die InvCharacters liste binde, tauchen die charaktere immernoch nich auf. Ich werd jetz mal gucken ob vllt im code fehler sind, sodass die Liste tatsächlich leer ist... ansonsten isses aber schonmal ein schritt in die richtige Richtung.
Ideen immer her!
EDIT: ok aus irgendeinem grund funzts plötzlich (sofern unsere Dummycharaktere Peter Pan, Captain Hook und Das Krokodil sind )
werd jetz ma gucken dass die dummies wieder verschwinden und danach den krempel einchecken, wenn die echten charaktere funktionieren.
Edit2: Charaktere und Auflistung funktionieren jetzt. Ein Problem war dass beim ersteleln der TextEditorVM die Charakterliste des Dialogs nicht korrekt übernommen wurde. ich checke jetzt ein.
Nächstes Todo: Binden des ausgewählten Charakters aus der Combolist.
Ich habe mal getestet wie ich ZB an ein Textfeld innerhalb eines Listbox items (im datatemplate) den titel des dialogs binden könnte und folgendes gemacht:
- Code:
<TextBlock Grid.Column="0" Text="{Binding Path=DataContext.Title, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" HorizontalAlignment="Center"/>
Ich hab testweise dafür einfach das label genommen, das normalerweise den string "From:" enthält und siehe da: es klappt.
Was ich dadurch herausgefunden habe: Wir müssen als parent nicht TabControl oder TabItem binden sondern die ListBox. Offensichtlich hat also die ListBox als DataContext die TextEditorVM.
Als ich mal spaßeshalber den Title an die Combobox gebunden habe waren auf einmal seeehr viele items in der combobox, also wurden offenbar die einzelnen Buchstaben aufgelistet (nur nicht angezeigt)...
Problem: wenn ich jetzt im selben DataContext die InvCharacters liste binde, tauchen die charaktere immernoch nich auf. Ich werd jetz mal gucken ob vllt im code fehler sind, sodass die Liste tatsächlich leer ist... ansonsten isses aber schonmal ein schritt in die richtige Richtung.
Ideen immer her!
EDIT: ok aus irgendeinem grund funzts plötzlich (sofern unsere Dummycharaktere Peter Pan, Captain Hook und Das Krokodil sind )
werd jetz ma gucken dass die dummies wieder verschwinden und danach den krempel einchecken, wenn die echten charaktere funktionieren.
Edit2: Charaktere und Auflistung funktionieren jetzt. Ein Problem war dass beim ersteleln der TextEditorVM die Charakterliste des Dialogs nicht korrekt übernommen wurde. ich checke jetzt ein.
Nächstes Todo: Binden des ausgewählten Charakters aus der Combolist.
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
ja krass. wobei mir aber das verständniss fehlt warum der datacontext die listbox sein soll, die listbox bindet doch an die TextLinesVM (ItemsSource="{Binding TextLines}") und dort liegen die InvCharacters nicht.
wie auch immer good job!
kannst du das konkretisieren? was genau soll wo gebunden werden?
wie auch immer good job!
Nächstes Todo: Binden des ausgewählten Charakters aus der Combolist.
kannst du das konkretisieren? was genau soll wo gebunden werden?
Tobias Stein- Anzahl der Beiträge : 88
Anmeldedatum : 23.10.12
Re: ausgewählte Charaktere Dialog
Da genau liegt der kleine denkfehler... der DataContext ist die TextEditorVM. Die ItemSource der Listbox bindet an TextLines (enthalten in der TextEditorVM). War mir so auch nich bewusst aber als ich in nem beispiel im internet quasi die gleiche situation gesehen hab wars plötzlich klar.
Was noch gebunden werden muss geht vermutlich mit SelectedValue und SelectedValuePath, da wollt ich nachher noch rumexperimentieren. Im Grunde muss das Ausgewählte Element der Combobox an speaker gebunden werden, somit wird gespeichert was ausgewählt ist, und beim öffnen des dialogs wird die selektion korrekt wiederhergestellt (ich hoffe zumindest dass wpf das so einfach handled wie es aussieht)
Was noch gebunden werden muss geht vermutlich mit SelectedValue und SelectedValuePath, da wollt ich nachher noch rumexperimentieren. Im Grunde muss das Ausgewählte Element der Combobox an speaker gebunden werden, somit wird gespeichert was ausgewählt ist, und beim öffnen des dialogs wird die selektion korrekt wiederhergestellt (ich hoffe zumindest dass wpf das so einfach handled wie es aussieht)
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
Kniet nieder!!! ich habs geschafft
Erklärung:
Itemsource: Wie gehabt Datacontext der Listbox=TexteditorVM -> Binding DataContext.InvCharacters
DisplayMemberPath: Hat per se dann den datacontext EINES items, also im moment T_Character. "name" zeigt auf den namen und dieser wird angezeigt (daher: DisplayMember)
Jetz der interessante teil:
SelectedItem: Bindet an Speaker, ist glaube ich per se oneway, dh bei auswahl haben wir den speaker gesetzt
SelectedValuePath: zeigt auf die cid (die von T_Character) und definiert, nach welchem Wert sich die selected Value (nicht die displayed) orientiert. Bspw. können so mehrere Charaktere denselben namen haben (theoretisch), aber da sie über die cid ausgewählt werden gibt es keine verwechslungen.
[b]SelectedValue[/]: Bindet an die cid des speakers, einmalig. ich vermute hier einen rein lesenden zugriff, bin nicht 100% sicher, daher hab ich den mode auf OneWaygestellt, damit das nich schiefgeht und in den charakter schreibt... An sich wird hier aber die cid des charakters gelesen, und anhand dieser (wg. dem selectedvaluepath="cid") die selektion fest gebunden.
Ich hab nen mini-testdialog in ne dateigespeichert zum testen. muss jetz noch ein paar minifixes in der textlinevm vornehmen und check den kram gleich ein.
- Code:
<ComboBox Grid.Column="0" Grid.Row="1" Width="70"
ItemsSource="{Binding Path=DataContext.InvCharacters, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"
DisplayMemberPath="name"
SelectedValuePath="cid"
SelectedValue="{Binding Speaker.cid, Mode=OneWay}"
SelectedItem="{Binding Speaker}"
/>
Erklärung:
Itemsource: Wie gehabt Datacontext der Listbox=TexteditorVM -> Binding DataContext.InvCharacters
DisplayMemberPath: Hat per se dann den datacontext EINES items, also im moment T_Character. "name" zeigt auf den namen und dieser wird angezeigt (daher: DisplayMember)
Jetz der interessante teil:
SelectedItem: Bindet an Speaker, ist glaube ich per se oneway, dh bei auswahl haben wir den speaker gesetzt
SelectedValuePath: zeigt auf die cid (die von T_Character) und definiert, nach welchem Wert sich die selected Value (nicht die displayed) orientiert. Bspw. können so mehrere Charaktere denselben namen haben (theoretisch), aber da sie über die cid ausgewählt werden gibt es keine verwechslungen.
[b]SelectedValue[/]: Bindet an die cid des speakers, einmalig. ich vermute hier einen rein lesenden zugriff, bin nicht 100% sicher, daher hab ich den mode auf OneWaygestellt, damit das nich schiefgeht und in den charakter schreibt... An sich wird hier aber die cid des charakters gelesen, und anhand dieser (wg. dem selectedvaluepath="cid") die selektion fest gebunden.
Ich hab nen mini-testdialog in ne dateigespeichert zum testen. muss jetz noch ein paar minifixes in der textlinevm vornehmen und check den kram gleich ein.
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
okidoke is alles drin
charaktere können jetzt ausgewählt werden und beim öffnen eines bestehenden dialogs werden die korrekt angezeigt.
Außerdem hab ich noch n paar fixes gemacht was die anzeige der froms udn tos angeht
Zudem hab ich noch dafür gesorgt dass bei "Add Option" der speaker auf den selben sprecher gesetzt wird, wie bei der ur-option. (im normalfall ist eine option ja eine option für den selben sprecher...)
Was in der UI noch fehlt (is mir grad aufgefallen) is die Anzeige der ID der Zeile, ich vermute aber dass die funktioniert, angesichts der beobachtungen beim "Add Answer" testen...
charaktere können jetzt ausgewählt werden und beim öffnen eines bestehenden dialogs werden die korrekt angezeigt.
Außerdem hab ich noch n paar fixes gemacht was die anzeige der froms udn tos angeht
Zudem hab ich noch dafür gesorgt dass bei "Add Option" der speaker auf den selben sprecher gesetzt wird, wie bei der ur-option. (im normalfall ist eine option ja eine option für den selben sprecher...)
Was in der UI noch fehlt (is mir grad aufgefallen) is die Anzeige der ID der Zeile, ich vermute aber dass die funktioniert, angesichts der beobachtungen beim "Add Answer" testen...
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
Was ihr hier seht ist mein erster Ansatz für das "Buttons ausblenden, wenn die Zeile nicht ausgewählt ist". Könnt im quelltext nachlesen wie das geht, ist ein einfacher trigger auf das IsSelected attribut der ListboxItems, mit nem Setter für die Visibility properties der buttons...
Jetzt an die Layouter: (sofern ihr wünscht dieses Feature zu perfektionieren und überhaupt zu übernehmen)
Wie ihr seht sind die Zeilen immernoch hoch. Das liegt daran, dass da immernoch die Combobox in der Zweiten Zeile ist. Wenn ihr das hinkriegt die in die Erste Zeile zu packen, werden die Zeilen die nciht ausgewählt werden flacher (und meiner meinung nach besser lesbar).
Zudem könnte man noch überlegen die Combobox auch noch verschwinden zu lassen und stattdessen ein Label mit dem Namen anzuzeigen (selbiges ginge sogar für die Textzeile, falls erwünscht)... Dann wären alle interaktiven Elemente nur noch für die Zeile in der man ist verfügbar.
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Re: ausgewählte Charaktere Dialog
arne, du bist ein held.
Tobias G.- Anzahl der Beiträge : 37
Anmeldedatum : 23.10.12
Re: ausgewählte Charaktere Dialog
krieg ich n cape? und am dienstag stellt ihr mich dann in heldenpose neben einen ventilator
ahertel- Anzahl der Beiträge : 507
Anmeldedatum : 25.10.12
Seite 1 von 1
Befugnisse in diesem Forum
Sie können in diesem Forum nicht antworten