WPF MVVM:对事件的绑定命令

时间:2014-09-12 13:37:55

标签: c# wpf xaml mvvm binding

我有自己的视图和viewmodel文件。在我的viewmodel中,我只有这个代码:

private void Filter(string keyword)
{
    Debug.Print("******START********");
    string stringToSearch = keyword.ToLower();
    ObservableCollection<TabImpianti> listBoxSource = new ObservableCollection<TabImpianti>();
    foreach (TabImpianti ti in p_ListaImpianti)
    {
        if (ti.NOME.ToString().ToLower().Contains(stringToSearch))
            listBoxSource.Add(ti);
    }
    p_ListaImpianti = listBoxSource;
    Debug.Print("******END********");
}

在我的xaml中我有:

<dxe:TextEdit  ValidateOnTextInput="True" Margin="105,10,797,631" />

DUMB问题:我如何将我的函数绑定到事件EditValueChanged,也像参数一样传递文本框的内容?简单的目标是:当用户在文本框中写入内容时,过滤绑定到视图模型的集合。

在线我发现了很多教程,代码片段等等,但其中任何一个都在帮助我理解。

4 个答案:

答案 0 :(得分:3)

可以用类似的东西来完成。

例如: -

<TextBox Margin="89,116,69,123" x:Name="txtFilter" Background="AliceBlue" >
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="TextChanged">
                <cmd:EventToCommand Command="{Binding SearchedTextChanged}" CommandParameter="{Binding Text, ElementName=txtFilter}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBox>

了解

http://www.c-sharpcorner.com/Blogs/11789/example-of-eventtrigger-in-mvvm-application.aspx http://social.msdn.microsoft.com/Forums/vstudio/en-US/fd819518-605a-46ae-a9e4-26556d0f3e15/wpf-textbox-trigger?forum=wpf

进一步举例。

答案 1 :(得分:2)

看一下以下好文章,该文章清楚地描述了与EventToCommand行为的DevExpress实现相关的所有方面:DevExpress MVVM Framework. EventToCommand.。 使用此方法,您可以按如下方式实现任务:

<dxe:TextEdit Margin="89,116,69,123" x:Name="txtFilter" Background="AliceBlue" >
    <dxmvvm:Interaction.Behaviors> 
        <dxmvvm:EventToCommand EventName="EditValueChanged" Command="{Binding FilterCommand}"
            CommandParameter="{Binding ElementName=txtFilter, Path=Text}"/> 
    </dxmvvm:Interaction.Behaviors> 
...
[POCOViewModel]
public class CoolectionViewModel {
    [Command]
    public void Filter(string searchText) {
        ...
    }
}

P.S。使用DevExpress控件,您可以通过搜索框完成列表框控件项的过滤,而无需任何编码。只需将ListBoxEdit.FilterCriteria属性绑定到SearchControl.FilterCriteria属性:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <dxe:SearchControl x:Name="searchControl" Grid.Row="0" Margin="10"
                     HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    <dxe:ListBoxEdit Name="listBox" Grid.Row="1"  Margin="10"
                     HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                     DisplayMember="Name" ValueMember="ID"
                     FilterCriteria="{Binding FilterCriteria, ElementName=searchControl}"/>
</Grid>

您可以使用following demo(链接指向Silverlight版本,但WPF版本的行为完全相同)来使用此方法。 您可以使用与DX(ListBoxEdit,ComboBoxEdit,DXGrid等)中的任何列表控件相同的方法。

答案 2 :(得分:0)

您可以将TextEdit的text属性绑定到ViewModel的属性并监视ViewModel的属性(PropertyChanged ?!),而不是将ViewModel函数绑定到View事件。

只要该属性发生变化,您就可以执行该功能。

通过这种方式,您仍然可以通过依赖引发的事件来测试ViewModel,而无需将其绑定到View。

答案 3 :(得分:-2)

您的TextEdit控件应绑定到ViewModel中的属性。在该属性的setter中,您将调用Filter方法。

此示例假设您的TextEdit控件具有Text属性。如果没有,请更改为绑定到属性名称。

<dxe:TextEdit Text="{Binding MyTextValue}"  ValidateOnTextInput="True" Margin="105,10,797,631" />

然后在ViewModel类中:

private string _myTextValue;
public string MyTextValue {
    get {
        return _myTextValue;
    }
    set {
        if (value != _myTextValue) {
            _myTextValue = value;
            Filter(_myTextValue);
        }
    }
 }