wpf 在 KeyBinding 手势上更改文本框的文本

wpf Change the text of Textbox on KeyBinding Gesture

我如何使用 MVVM 模式解决这个问题,我正在使用 Devexpress MVVM。我有很多表格中的文本框。

当用户按下 Ctrl+B 并且文本框的当前文本为 null""[= 时,我需要将文本框文本设置为“[空白]” 17=]

但如果可能的话,我正在寻找一种使用 IValueConverter 的方法

我有一个class类似的

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 Text="{Binding District}"  >
                <TextBox.InputBindings>
                    <KeyBinding Gesture="Ctrl+B">
                    </KeyBinding>
                </TextBox.InputBindings>
            </TextBox>

但我的问题是如何在按键时调用它?我做对了吗?

要使用 KeyBinding 执行操作,您不能使用 IValueConverterIValueConverters 用于转换值,而不是执行操作。您需要的是定义一个实现 ICommand 的 class,然后将 class 的一个实例分配给 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;
}

然后创建此 class 的实例并将其附加到您的 ViewModel,以便 KeyBinding 可以访问它:

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

然而,当用户按下键盘快捷键时将文本更改为“[空白]”是一种奇怪的用户体验模式。我建议改为在文本框中添加一个占位符。