WPF MVVM:将命令绑定到事件
本文关键字:绑定 事件 命令 MVVM WPF | 更新日期: 2023-09-27 18:21:36
我有我的视图和视图模型文件。在我的视图模型中,我有一个简单的代码:
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,并像参数一样传递文本框的内容?简单的目标是:当用户在文本框中写入内容时,过滤绑定到视图模型的集合。
我在网上找到了很多教程、代码片段等等,但其中任何一个都在帮助我理解。
可以用类似的方法来完成。
例如:-
<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.aspxhttp://social.msdn.microsoft.com/Forums/vstudio/en-US/fd819518-605a-46ae-a9e4-26556d0f3e15/wpf-textbox-trigger?forum=wpf
例如。
看看下面这篇好文章,它清楚地描述了与EventToCommand行为的DevExpress实现相关的所有方面:DevExpress MVVM框架。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) {
...
}
}
附言:使用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>
您可以使用以下演示来使用这种方法(链接指向Silverlight版本,但WPF版本的行为完全相同)。您可以对DX中的任何列表控件使用相同的方法(ListBoxEdit、ComboBoxEdit、DXGrid等)
您可以将TextEdit的文本属性绑定到ViewModel的属性并监视ViewModel的该属性(PropertyChanged?!),而不是将ViewModel函数绑定到View的事件。
一旦该属性发生更改,您就可以执行该函数。
这样,您仍然可以测试ViewModel,而无需依赖引发的事件将其绑定到视图。
您的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);
}
}
}