Как мне обрабатывать события в пользовательском элементе управления? - PullRequest
1 голос
/ 23 марта 2020

У меня есть пользовательский ItemsControl просто так

public class MyControl : ItemsControl { }

Мой шаблон будет что-то вроде

<Style TargetType="{x:Type local:MyControl}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBox Text="{Binding Text}" /> 
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Теперь я хочу действовать, когда либо, когда ENTER или ПРОБЕЛ получил нажатие, поэтому я бы сделал что-то вроде этого

<TextBox Text="{Binding Text}">
    <TextBox.InputBindings>
        <KeyBinding Key="Space" 
                    Command="{Binding KeyPressedCommand}" 
                    CommandParameter="{x:Static Key.Space}"/>
    </TextBox.InputBindings>
</TextBox>

Но как мне связать это с моим Контролем?

1 Ответ

1 голос
/ 23 марта 2020

Один из способов решить эту проблему - использовать шаблон MVVM и RelayCommand класс из учебник .

RelayCommand.cs

public class RelayCommand : ICommand
{
    private readonly Action<object> _execute;
    private readonly Func<object, bool> _canExecute;

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);
    public void Execute(object parameter) => _execute(parameter);
}

Затем вы должны установить DataContext вашего окна (или UserControl), оно требуется для разрешения привязок в xaml.

Один из способов сделать это:

MainWindow.xaml

<Window.DataContext>
    <local:MainViewModel/>
</Window.DataContext>

Настройка Text Свойство и KeyPressedCommand из примера "что-то вроде этого" в классе MainViewModel.

MainViewModel.cs

public class MainViewModel : INotifyPropertyChanged
{
    private bool _text;
    public bool Text
    {
        get => _text;
        set
        {
            _text = value;
            OnPropertyChanged(nameof(Text));
            // Text changed!
        }
    }
    public ICommand KeyPressedCommand => new RelayCommand(obj =>
    {
        if (obj is Key key) {
            // do something here with the 'key' provided by CommandParameter
        }
    });

    public MainViewModel()
    {
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...