如何从视图获取CommandParameter值到viewModel

时间:2014-09-25 06:38:12

标签: c# wpf mvvm

这是我的视图(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 +空格键,我想在命令绑定方法中获取值。

2 个答案:

答案 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不是为了这个)
在代码隐藏文件中为您的控件和简单使用事件处理程序创建新项目。