Übliche Lösung für diese Art von Problemen ist die Verwendung einer ordnungsgemäßen (normalerweise implizit) Style
. Leider ist es nicht möglich, Interaction.Behaviors
oder Interaction.Triggers
Sammlungen über einen Stil zu bevölkern. Zumindest nicht direkt, obwohl es einige Workarounds gibt, wie zB this one, die @Sinatr in seinem Kommentar erwähnt.
Meiner Meinung nach aber eine bessere Lösung ist dedizierte Hilfsklasse mit einem daran befestigten Eigenschaft zu erstellen, mit dem Sie zwei Vögel können zusätzlich mit einer Klappe schlagen und richtigen Parameter an den Befehl übergeben:
public static class NavigationRadioButtonHelper
{
public static readonly DependencyProperty CommandProperty =
DependencyProperty.RegisterAttached(
name: "Command",
propertyType: typeof(ICommand),
ownerType: typeof(NavigationRadioButtonHelper),
defaultMetadata: new PropertyMetadata(null, HandleCommandChanged));
public static ICommand GetCommand(NavigationRadioButton control)
=> (ICommand)control.GetValue(CommandProperty);
public static void SetCommand(NavigationRadioButton control, ICommand value)
=> control.SetValue(CommandProperty, value);
private static void HandleCommandChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null)
{
((NavigationRadioButton)d).AddHandler(
routedEvent: Mouse.PreviewMouseDownEvent,
handler: (MouseButtonEventHandler)HandlePreviewMouseDown);
}
else
{
((NavigationRadioButton)d).RemoveHandler(
routedEvent: Mouse.PreviewMouseDownEvent,
handler: (MouseButtonEventHandler)HandlePreviewMouseDown);
}
}
private static void HandlePreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var control = (NavigationRadioButton)sender;
var command = GetCommand(control);
var parameter = $"{control.RegionName},{control.ViewName}";
if (command != null && command.CanExecute(parameter))
command.Execute(parameter);
}
}
Was passiert hier, wenn der Eigenschaft ein Befehl zugewiesen wird, wird ein Handler für das Mouse.PreviewMouseDownEvent
zu dem zugehörigen Objekt hinzugefügt, das einfach den angehängten Befehl ausführt, wodurch bequem der erforderliche Parameter zur gleichen Zeit konstruiert wird. Wenn der Befehl auf null
festgelegt ist, wird der Handler entfernt. Und da diese Funktionalität nur auf einem einzigen beigefügten Abhängigkeitseigenschaft beruht, kann es leicht mit einem Stil in Kombination verwendet werden:
<Style TargetType="{x:Type vw:NavigationRadioButton}">
<Setter Property="ns:NavigationRadioButtonHelper.Command" Value="{Binding (...)}" />
</Style>
ich Sie gehe davon haben nicht die Macht, die NavigationRadioButton
Klasse zu ändern, wobei in diesem Fall Diese Logik könnte innerhalb dieser Klasse ohne die Notwendigkeit einer Hilfsklasse integriert werden.
Sammlungen der Regel nicht über eine Art bestückt werden kann, nur zugeordnet. Keine der beiden Eigenschaften ist öffentlich zugänglich, und entsprechende Setter-Methoden sind nicht öffentlich verfügbar und können als solche in dem Sinne als schreibgeschützt betrachtet werden, dass ihre Werte nicht zugewiesen, sondern nur modifiziert werden können.
* "Hinzufügen ... zu allen Steuerelementen des Typs" * = Stil mit 'TargetType'. Niemals Blend verwendet. – Sinatr
@Sinatr Unglücklicherweise sind 'Interaction.Behaviors' und' Interaction.Triggers' Sammlungen nicht innerhalb von 'Style' verwendbar, da sie schreibgeschützte Eigenschaften sind (dasselbe Problem gibt es zum Beispiel für' Grid.ColumnDefinitions'). – Grx70
@ Grx70, [machbar] (https://stackoverflow.com/q/22321966/1997232). – Sinatr