Z MVVM Światła masz EventToCommand
:
więc można w XAML drutu up imprezy zamykającej do VM.
<Window ...
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:command="http://www.galasoft.ch/mvvmlight">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<command:EventToCommand Command="{Binding ClosingCommand}"
PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
aw VM:
public RelayCommand<CancelEventArgs> ClosingCommand { get; private set; }
ctor() {
ClosingCommand = new RelayCommand<CancelEventArgs>(args => args.Cancel = true);
}
Jeśli nie chcesz przekazać CancelEventArgs
do VM:
Można zawsze przyjmuje podobne podejście z Behavior
i po prostu użyć prosty bool
z VM (powiązanie tego bool z Zachowaniem), aby wskazać, że zdarzenie zamknięcia powinno zostać anulowane.
Aktualizacja:
Download Link for following example
Aby to zrobić z Behavior
można tylko mieć Behavior
takich jak:
internal class CancelCloseWindowBehavior : Behavior<Window> {
public static readonly DependencyProperty CancelCloseProperty =
DependencyProperty.Register("CancelClose", typeof(bool),
typeof(CancelCloseWindowBehavior), new FrameworkPropertyMetadata(false));
public bool CancelClose {
get { return (bool) GetValue(CancelCloseProperty); }
set { SetValue(CancelCloseProperty, value); }
}
protected override void OnAttached() {
AssociatedObject.Closing += (sender, args) => args.Cancel = CancelClose;
}
}
Teraz w XAML:
<i:Interaction.Behaviors>
<local:CancelCloseWindowBehavior CancelClose="{Binding CancelClose}" />
</i:Interaction.Behaviors>
Gdzie CancelClose
jest właściwością bool z VM, która wskazuje, czy zdarzenie Closing
powinno zostać anulowane, czy też nie. W załączonym przykładzie mam Button
, aby włączyć tę bool z VM, które powinny pozwolić przetestować Behavior
W normalnej MVVM jest to proste z dołączoną właściwością. Nie wiadomo, jak to działa z MVVMLight choć ... –