如何将我的viewmodel中的方法绑定到TextChanged?

时间:2016-06-09 17:33:51

标签: c# wpf mvvm

我在弄清楚如何将我的方法正确绑定到viewmodel时遇到了一些麻烦。

这是我目前的XAML:

<TextBox x:Name="Length" Style="{StaticResource LengthStyle}" Height="Auto" Width="35" 
TextChanged="{Binding Validate}" Text="{Binding Length, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}" />

然后在我的viewmodel中,我有一个看起来像这样的方法:

public string Validate(Column c){
    //unimportant
}

我只是对如何让它发挥作用感到困惑。我应该有一个调用它的setter属性吗?我会把它设置为代码背后的事件,但我正在研究的项目禁止这样做。感谢。

2 个答案:

答案 0 :(得分:0)

创建如下所示的属性

private string length;

public string Length
{
    get
    {
        return length;
    }
    set
    {
        length = value;
        //do whatever you want
     }
}

答案 1 :(得分:0)

包括这两个互动参考: 1. System.Windows.Interactivity 2. Microsoft.Expression.Interactions

然后在你的xaml声明:

xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:interactions="clr-namespace:Microsoft.Expression.Interactivity.Input;assembly=Microsoft.Expression.Interactions"

文本框的xaml将如下:

<TextBox>
            <interactivity:Interaction.Triggers>
                <interactivity:EventTrigger EventName="TextChanged">
                    <behaviours:ExecuteCommandAction Command="{Binding Path=DataContext.ValidateCommand, 
                                                                           RelativeSource={RelativeSource FindAncestor,
                                                                                                          AncestorType={x:Type UserControl}}}"
                                                     CommandParameter="PassTheColumnHere"/>
                </interactivity:EventTrigger>
            </interactivity:Interaction.Triggers>
        </TextBox>

您可能需要根据您的要求进行2次更改: 1.而不是Ancestortype“Usercontrol”(如果您的xaml不是用户控件“),而是给出文件名。 2.通过命令参数,在您的情况下,您提到的列。

之后在视图模型中声明命令“ValidateCommand”:

public ICommand ValidateCommand{ get; private set; }

在构造函数内部初始化它:

ValidateCommand = new DelegateCommand<Column>(Validate);

以及您可以在方法中实现的其余逻辑:

public void Validate(Column c){
    //your logic
}