none
Problem beim Binding eines Commands als Dependency Property in einem CustomUserControl RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,

    ich habe ein Custom User Control erstellt mit einer TextBox und einem Button. Nun möchte ich mit Click auf den Button die TextBox leeren und den Focus wieder auf die TextBox setzen. Hier meine Testimplementation:

    Usercontrol-Klasse:

    public class CustomSearchControl : Control
        {
            static CustomSearchControl()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomSearchControl),
                            new FrameworkPropertyMetadata(typeof(CustomSearchControl)));
            }
    
            public event EventHandler OnSearchTextChanged;
            public static readonly DependencyProperty SearchTextProperty =
                        DependencyProperty.Register("SearchText", typeof(string),
                                                                  typeof(CustomSearchControl),
                                                                  new PropertyMetadata(new PropertyChangedCallback(SearchTextPropertyChanged)));
    
            public string SearchText
            {
                get { return (string)base.GetValue(SearchTextProperty); }
                set { base.SetValue(SearchTextProperty, value); }
            }
    
            public static void SearchTextPropertyChanged(DependencyObject inDO, DependencyPropertyChangedEventArgs inArgs)
            {
                CustomSearchControl stb = inDO as CustomSearchControl;
                stb?.OnSearchTextChanged?.Invoke(stb, null);
            }
    
            public static readonly DependencyProperty SearchDeleteCommandProperty =
                      DependencyProperty.RegisterAttached("SearchDeleteCommand",
                                        typeof(ICommand),
                                        typeof(CustomSearchControl),
                                        new FrameworkPropertyMetadata(SearchDeleteCommandChanged));
    
            public ICommand SearchDeleteCommand
            {
                get { return (ICommand)this.GetValue(SearchDeleteCommandProperty); }
                set { this.SetValue(SearchDeleteCommandProperty, value); }
            }
    
            public static void SearchDeleteCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
            }
    
            public bool CanExecute(object parameter)
            {
                return true;
            }
    
            public void Execute(object parameter)
            {
                SearchDeleteCommand.Execute("");
            }
        }

    Das zugehörige ResourceDictionary:

    <ResourceDictionary x:Class="CustomSearchControl" 
                        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:local="clr-namespace:WpfApplicationCustomSearchControl">
        
        <Style TargetType="{x:Type local:CustomSearchControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:CustomSearchControl}">
                        <Grid>
                            <StackPanel Orientation="Horizontal">
                                <TextBox x:Name="tbSearchTextBox"
                                         Width="200" Height="25"
                                         Text="{TemplateBinding SearchText}">
                                </TextBox>
                                <Button x:Name="btnDelete"
                                        Width="50" Height="25"
                                        Content="Delete"
                                        Command="{TemplateBinding SearchDeleteCommand}">
                                </Button>
                            </StackPanel>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

    Die App.xaml:

    <Application x:Class="WpfApplicationCustomSearchControl.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfApplicationCustomSearchControl"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/CustomSearchControlStyle.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>

    und dann im StartFenster:

    <Grid>
        <local:CustomSearchControl/>
    </Grid>

    Leider passiert beim Click auf den Button gar nichts. Die entsprechenden Methoden in der UserControl-Klasse werden gar nicht aufgerufen.

    Kann mir hier jemand auf die Sprünge helfen?

    Gruß Jürgen

    Montag, 10. April 2017 08:11

Alle Antworten

  • Hallo Jürgen,

    Beim Klicken kannst Du den Text in einer Schaltfläche mit dem UIElement.GotFocus Ereignishandler löschen, wie in diesem Thread gezeigt wird:
    Remove text after clicking in the textbox
    Der FocusManager steuert den Fokus innerhalb eines bestimmten Fokusbereichs. Sieh Dir diesen Thread an:
    Using XAML to Set Focus on a Textbox in WPF Desktop Applications

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 11. April 2017 08:00
    Moderator