wpf Изменить текст текстового поля в жесте связывания клавиш - PullRequest
0 голосов
/ 24 мая 2018

как я могу решить эту проблему с помощью шаблона MVVM, и я использую Devexpress MVVM.У меня есть много текстовых полей в форме.

И мне нужно установить текст текстового поля в «[пусто]», когда пользователь нажимает Ctrl+B и текущий текст текстового поля null или ""

Но я ищу способ использовать IValueConverter, если возможно

У меня есть класс, подобный этому

public class BlankText : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (string.IsNullOrEmpty(value.ToString()))
                return "[blank]";
            else
                return value;
        }
    }

И у меня есть этот код вресурсы

    <UserControl.Resources>
        <c:BlankText x:Key="BlankText"/>
    </UserControl.Resources>

Это мой TextBox

           <TextBox Text="{Binding District}"  >
                <TextBox.InputBindings>
                    <KeyBinding Gesture="Ctrl+B">
                    </KeyBinding>
                </TextBox.InputBindings>
            </TextBox>

Но моя проблема в том, как я могу вызвать его при нажатии клавиши?Я делаю это правильно?

1 Ответ

0 голосов
/ 24 мая 2018

Для выполнения действий с использованием KeyBinding нельзя использовать IValueConverter.IValueConverter s для преобразования значений, а не выполнения действий.Вам нужно определить класс, который реализует ICommand, а затем назначить экземпляр этого класса KeyBinding.Command.

public class BlankCommand : ICommand 
{
    public MyViewModel ViewModel { get; }

    public BlankCommand(MyViewModel vm)
    {
        this.ViewModel = vm;
    }

    public void Execute(object parameter) 
    {
        // parameter is the name of the property to modify

        var type = ViewModel.GetType();
        var prop = type.GetProperty(parameter as string);
        var value = prop.GetValue(ViewModel);

        if(string.IsNullOrEmpty(value))
            prop.SetValue(ViewModel, "[blank]");
    }

    public boolean CanExecute(object parameter) => true;

    public event EventHandler CanExecuteChanged;
}

Затем создать экземпляр этого класса и присоединить его к вашему ViewModel такчто KeyBinding может получить к нему доступ:

<TextBox Text="{Binding District}">
    <TextBox.InputBindings>
        <KeyBinding Gesture="Ctrl+B" Command="{Binding MyBlankCommand}" CommandParameter="District"/>
    </TextBox.InputBindings>
</TextBox>

Изменение текста, чтобы сказать «[пробел]», когда пользователь нажимает сочетание клавиш, является странным шаблоном UX, однако.Вместо этого я бы предложил добавить заполнитель в текстовое поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...