visual studio redondos redondo redondear redondeados personalizados con botones boton bordes borde wpf button listbox styles controltemplate

studio - Borrar la selección de la lista de wpf con el botón en la plantilla de control y sin código detrás



botones redondos visual studio 2017 (1)

Quiero crear un Style para un ListBox WPF que incluya un Button en ControlTemplate en el que el usuario pueda hacer clic y ListBox selección de ListBox . No quiero usar codebehind para que este Style se pueda aplicar a cualquier ListBox . He intentado utilizar EventTrigger y Storyboard y ha resultado problemático, ya que solo funciona la primera vez y al detener Storyboard se Storyboard la selección anterior. Sé que podría usar un control de usuario, pero quiero saber si es posible lograrlo usando solo un Style .


No es posible lograr esto usando XAML y solo las clases proporcionadas por .NET framework. Sin embargo, aún puede producir una solución reutilizable definiendo un nuevo comando ( ClearSelectionCommand ) y una nueva propiedad adjunta ( ClearSelectionOnCommand ).

Entonces puedes incorporar esos elementos en tu estilo.

Ejemplo:

public class SelectorBehavior { public static RoutedCommand ClearSelectionCommand = new RoutedCommand( "ClearSelectionCommand", typeof(SelectorBehavior)); public static bool GetClearSelectionOnCommand(DependencyObject obj) { return (bool)obj.GetValue(ClearSelectionOnCommandProperty); } public static void SetClearSelectionOnCommand( DependencyObject obj, bool value) { obj.SetValue(ClearSelectionOnCommandProperty, value); } public static readonly DependencyProperty ClearSelectionOnCommandProperty = DependencyProperty.RegisterAttached( "ClearSelectionOnCommand", typeof(bool), typeof(SelectorBehavior), new UIPropertyMetadata(false, OnClearSelectionOnCommandChanged)); public static void OnClearSelectionOnCommandChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { Selector selector = d as Selector; if (selector == null) return; bool nv = (bool)e.NewValue, ov = (bool)e.OldValue; if (nv == ov) return; if (nv) { selector.CommandBindings.Add( new CommandBinding( ClearSelectionCommand, ClearSelectionCommand_Executed, ClearSelectionCommand_CanExecute)); } else { var cmd = selector .CommandBindings .Cast<CommandBinding>() .SingleOrDefault(x => x.Command == ClearSelectionCommand); if (cmd != null) selector.CommandBindings.Remove(cmd); } } public static void ClearSelectionCommand_Executed( object sender, ExecutedRoutedEventArgs e) { Selector selector = (Selector)sender; selector.SelectedIndex = -1; } public static void ClearSelectionCommand_CanExecute( object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } }

Ejemplo de uso: XAML:

<Window x:Class="ClearSelectionBehaviorLibrary.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:ClearSelectionBehaviorLibrary" Title="Window1" Height="300" Width="300"> <Window.Resources> <Style x:Key="MyStyle" TargetType="Selector"> <Setter Property="local:SelectorBehavior.ClearSelectionOnCommand" Value="True"/> </Style> </Window.Resources> <Grid> <DockPanel> <Button DockPanel.Dock="Bottom" Content="Clear" Command="{x:Static local:SelectorBehavior.ClearSelectionCommand}" CommandTarget="{Binding ElementName=TheListBox}"/> <ListBox Name="TheListBox" ItemsSource="{Binding MyData}" Style="{StaticResource MyStyle}"/> </DockPanel> </Grid> </Window>

Ejemplo de uso - Código detrás:

public partial class Window1 : Window { public List<string> MyData { get; set; } public Window1() { MyData = new List<string> { "aa","bb","cc","dd","ee" }; InitializeComponent(); DataContext = this; } }