Ich bin immer noch grokking angehangenen Verhaltensweisen im Allgemeinen, und bin nicht in der Lage zu sehen, wie man einen Unit-Test für einen schreiben.Unit-Test ein angehängtes Verhalten wpf
Ich habe etwas Code unten aus Sacha Barbers Cinch-Framework eingefügt, der es erlaubt, ein Fenster über angehängtes Verhalten zu schließen. Kann mir jemand einen Beispiel-Unit-Test zeigen?
Danke!
Berryl
#region Close
/// <summary>Dependency property which holds the ICommand for the Close event</summary>
public static readonly DependencyProperty CloseProperty =
DependencyProperty.RegisterAttached("Close",
typeof(ICommand), typeof(Lifetime),
new UIPropertyMetadata(null, OnCloseEventInfoChanged));
/// <summary>Attached Property getter to retrieve the CloseProperty ICommand</summary>
public static ICommand GetClose(DependencyObject source)
{
return (ICommand)source.GetValue(CloseProperty);
}
/// <summary>Attached Property setter to change the CloseProperty ICommand</summary>
public static void SetClose(DependencyObject source, ICommand command)
{
source.SetValue(CloseProperty, command);
}
/// <summary>This is the property changed handler for the Close property.</summary>
private static void OnCloseEventInfoChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var win = sender as Window;
if (win == null) return;
win.Closing -= OnWindowClosing;
win.Closed -= OnWindowClosed;
if (e.NewValue == null) return;
win.Closing += OnWindowClosing;
win.Closed += OnWindowClosed;
}
/// <summary>
/// This method is invoked when the Window.Closing event is raised.
/// It checks with the ICommand.CanExecute handler
/// and cancels the event if the handler returns false.
/// </summary>
private static void OnWindowClosing(object sender, CancelEventArgs e)
{
var dpo = (DependencyObject)sender;
var ic = GetClose(dpo);
if (ic == null) return;
e.Cancel = !ic.CanExecute(GetCommandParameter(dpo));
}
/// <summary>
/// This method is invoked when the Window.Closed event is raised.
/// It executes the ICommand.Execute handler.
/// </summary>
static void OnWindowClosed(object sender, EventArgs e)
{
var dpo = (DependencyObject)sender;
var ic = GetClose(dpo);
if (ic == null) return;
ic.Execute(GetCommandParameter(dpo));
}
#endregion
Cinch geht einen Schritt weiter mit dem RelayCommand, indem Sie Ihren wiscalled Test in eine CommandSucceeded bool Eigenschaft backen. Ihr Beitrag ist hilfreich bei der Durchsetzung, dass SetClose am Ende des Tages immer noch ein Eigenschaften-Setter ist, auch wenn es nicht wie die einfacheren normalen C# -Eigenschaften-Setter aussieht! Das ist eines der Dinge, die ich nicht sah und die für mich noch nicht intuitiv ist. Prost – Berryl
Ja. Beim Kompilieren werden diese statischen Get/Set-Methoden aufgerufen. Dasselbe gilt für DPs: Es überspringt den Property Wrapper und ruft 'SetValue' /' GetValue' direkt auf dem 'DependencyObject' auf. Gut zu hören in Cinch. Ich habe es noch nicht gelesen. –