这是我的视图(TypeAheadTextBox.xaml)
<TextBox x:Name="textBox" Width="300" Text="{Binding SomeText, UpdateSourceTrigger=PropertyChanged}" TextChanged="textBox_TextChanged_1" SelectionChanged="textBox_SelectionChanged">
<TextBox.InputBindings>
<KeyBinding Command="{Binding LeftCtrlKeyPressed, Mode=TwoWay}" Key="Space" Modifiers="Control" />
<KeyBinding Key="Down" Command="{Binding TextBoxDownArrow, Mode=TwoWay}" />
</TextBox.InputBindings>
</TextBox>
这是我的视图 cs文件(TypeAheadTextBox.xmal.cs)
public partial class TypeAheadControl
{
public TypeAheadControl()
{
InitializeComponent();
}
private void textBox_TextChanged_1(object sender, TextChangedEventArgs e)
{
SetCommandParameter(sender);
}
private void textBox_SelectionChanged(object sender, RoutedEventArgs e)
{
SetCommandParameter(sender);
}
private void SetCommandParameter(object sender)
{
TextBox textBox = sender as TextBox;
if (textBox != null && textBox.Text.Length > 0)
{
KeyBinding kb = textBox.InputBindings[0] as KeyBinding;
if (kb != null)
{
string[] words = textBox.Text.Split(new char[] { ' ' });
if (textBox.CaretIndex == textBox.Text.Length)
{
//return last word
kb.CommandParameter = words[words.Length - 1];
Console.WriteLine(words[words.Length - 1]);
}
else
{
int charCount = 0;
foreach (string word in words)
{
charCount += word.Length;
if (charCount >= textBox.CaretIndex)
{
kb.CommandParameter = word;
Console.WriteLine(word);
break;
}
}
}
}
}
}
}
这是我的 ViewModel 类(部分内容)
private DelegateCommand _leftCtrlKeyPressed;
public ICommand LeftCtrlKeyPressed
{
get
{
if (_leftCtrlKeyPressed == null)
{
_leftCtrlKeyPressed = new DelegateCommand(CtrlKeyDetected);
}
return _leftCtrlKeyPressed;
}
set { }
}
public void CtrlKeyDetected()
{
Console.WriteLine("Test=====>>" + CurrentWord);
}
我的问题:
现在我想在我的viewModel deligateCommand Action中访问Textbox keybinding命令参数值
CtrlKeyDetected()。
有人可以告诉我如何实现这一目标。
该计划实际上做了什么?
假设您在文本框中写下了一些文本,并将光标放在一个单词上,我的目标是在光标的当前位置下获取当前单词。一旦用户按下ctrl +空格键,我想在命令绑定方法中获取值。
答案 0 :(得分:1)
如果您正在使用例如PRISM DelegateCommand
,那么也应该有一个通用版本。
通用版本接受命令参数,因此以下内容应该有效:
private DelegateCommand<string> _leftCtrlKeyPressed;
public ICommand LeftCtrlKeyPressed
{
get
{
if (_leftCtrlKeyPressed == null)
{
_leftCtrlKeyPressed = new DelegateCommand<string>(CtrlKeyDetected);
}
return _leftCtrlKeyPressed;
}
set { }
}
public void CtrlKeyDetected(string parameter)
{
Console.WriteLine("Test=====>>" + parameter);
}
答案 1 :(得分:-2)
OMG!你的代码有异味。
Stopp使用MVVM方法开发UserControls(MVVM不是为了这个)
在代码隐藏文件中为您的控件和简单使用事件处理程序创建新项目。