Hallo Leute,
ich habe mich nun etwas mit AttachedProperties herumgeärgert. Und nach Recherchen im Internet habe ich nun auch eine Möglichkeit gefunden, das für einen Fall einzusetzen.
Ich habe hier nun aber tatsächlich ein paar Verständnisprobleme dabei. Ich möchte aus dem ViewModel heraus das Window (geöffnet mittels ShowDialog()) schließen. Nach vielem Lesen habe ich herausgefunden, dass es zwei Möglichkeiten gibt, das im MVVM zu realisieren.
1. Man bricht etwas mit dem MVVM und gibt beim Load-Event des Windows einen Ereignishandler an das ViewModel weiter.
2. Man erstellt eine AttachedProperty.
Letzteres habe ich nun mit zur Hilfenahme des Internets gebaut.
Nachdem ich etwas rumgetüftelt habe, funktioniert es nun soweit auch. Hier der Code:
Mein XAML-Code:
Wie gesagt, das funktioniert soweit. Wenn ich das nun richtig verstanden habe, dann ist bei
Warum funktioniert dieser Code wunderbar, aber derjenige, den ich vorher hatte nicht (hat mich 2 Stunden gekostet, herauszufinden, dass es an der Art und Weise lag):
Alter Code
Was genau ist der Auslöser dafür, dass ich hier den DataContext als DataContext setzen muss und nicht über die Ressource gehen kann?
Wie müsste ich es schreiben, damit ich über die Ressource gehen könnte? Das wäre ja interessant, wenn ich zum Beispiel mehrere DataContexts hätte und ich von allen Zugriff darauf haben möchte.
Gruß Pascal
ich habe mich nun etwas mit AttachedProperties herumgeärgert. Und nach Recherchen im Internet habe ich nun auch eine Möglichkeit gefunden, das für einen Fall einzusetzen.
Ich habe hier nun aber tatsächlich ein paar Verständnisprobleme dabei. Ich möchte aus dem ViewModel heraus das Window (geöffnet mittels ShowDialog()) schließen. Nach vielem Lesen habe ich herausgefunden, dass es zwei Möglichkeiten gibt, das im MVVM zu realisieren.
1. Man bricht etwas mit dem MVVM und gibt beim Load-Event des Windows einen Ereignishandler an das ViewModel weiter.
2. Man erstellt eine AttachedProperty.
Letzteres habe ich nun mit zur Hilfenahme des Internets gebaut.
Nachdem ich etwas rumgetüftelt habe, funktioniert es nun soweit auch. Hier der Code:
C#-Quellcode
- public static class DialogCloser
- {
- //Registriert die DialogResult-Property als Attached-Property
- public static readonly DependencyProperty DialogResultProperty = DependencyProperty.RegisterAttached(
- "DialogResult",
- typeof(bool?),
- typeof(DialogCloser),
- new PropertyMetadata(DialogResultChanged));
- //Wenn sich der Wert ändert, wird bei dem angegebenen Objekt die DialogResult-Eigenschaft gesetzt
- private static void DialogResultChanged(DependencyObject dObject, DependencyPropertyChangedEventArgs e)
- {
- var window = dObject as Window;
- if (window != null)
- {
- window.DialogResult = e.NewValue as bool?;
- }
- }
- //Setter
- public static void SetDialogResult(Window target, bool? value)
- {
- target.SetValue(DialogResultProperty, value);
- }
- //Getter
- public static bool? GetDialogResult(DependencyObject dObject)
- {
- return (bool?)dObject.GetValue(DialogResultProperty);
- }
- }
Mein XAML-Code:
XML-Quellcode
- <Window x:Class="WoolMaster3000.Dialog.AddInstructionDialog"
- ...
- xmlns:local="clr-namespace:WoolMaster3000.Dialog"
- xmlns:att="clr-namespace:WoolMaster3000.Attached"
- xmlns:viewmodel="clr-namespace:WoolMaster3000.ViewModel.DialogViewModel"
- mc:Ignorable="d"
- att:DialogCloser.DialogResult="{Binding DialogResult}"
- Title="AddInstructionDialog" Height="450" Width="800" WindowStyle="None">
- <Window.DataContext>
- <viewmodel:AddInstructionViewModel />
- </Window.DataContext>
- ...
Wie gesagt, das funktioniert soweit. Wenn ich das nun richtig verstanden habe, dann ist bei
att:DialogCloser.DialogResult="{Binding DialogResult}"
DialogResult das DialogResult, das ich im ViewModel habe und es wird an an die AttachedProperty vom DialogCloser gebunden. Da dieses im Window-Element gesetzt ist, wird bei DialogResultChanged bei eben jenem Window die DialogResult-Eigenschaft auf den Wert gesetzt, der bei DialogResult im ViewModel gesetzt wurde. Habe ich das soweit richtig verstanden?Warum funktioniert dieser Code wunderbar, aber derjenige, den ich vorher hatte nicht (hat mich 2 Stunden gekostet, herauszufinden, dass es an der Art und Weise lag):
Alter Code
XML-Quellcode
- <Window x:Class="WoolMaster3000.Dialog.AddInstructionDialog"
- ...
- xmlns:att="clr-namespace:WoolMaster3000.Attached"
- xmlns:viewmodel="clr-namespace:WoolMaster3000.ViewModel.DialogViewModel"
- mc:Ignorable="d"
- att:DialogCloser.DialogResult="{Binding Source={StaticResource ViewModel}, Path=DialogResult}"
- Title="AddInstructionDialog" Height="450" Width="800" WindowStyle="None">
- <Window.Resources>
- <viewmodel:AddInstructionViewModel x:Key="ViewModel"/>
- </Window.Resources>
- <DockPanel DataContext="ViewModel">
Was genau ist der Auslöser dafür, dass ich hier den DataContext als DataContext setzen muss und nicht über die Ressource gehen kann?
Wie müsste ich es schreiben, damit ich über die Ressource gehen könnte? Das wäre ja interessant, wenn ich zum Beispiel mehrere DataContexts hätte und ich von allen Zugriff darauf haben möchte.
Gruß Pascal