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
执行操作,您不能使用 IValueConverter
。 IValueConverter
s 用于转换值,而不是执行操作。您需要的是定义一个实现 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>
然而,当用户按下键盘快捷键时将文本更改为“[空白]”是一种奇怪的用户体验模式。我建议改为在文本框中添加一个占位符。
我如何使用 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
执行操作,您不能使用 IValueConverter
。 IValueConverter
s 用于转换值,而不是执行操作。您需要的是定义一个实现 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>
然而,当用户按下键盘快捷键时将文本更改为“[空白]”是一种奇怪的用户体验模式。我建议改为在文本框中添加一个占位符。