簡體   English   中英

WPF MVVM:將命令綁定到事件

[英]WPF MVVM: binding command to event

我有我的視圖和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" />

啞巴問題:如何將我的函數綁定到事件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.aspx http://social.msdn.microsoft.com/Forums/vstudio/en-US/fd819518 -605a-46ae-a9e4-26556d0f3e15 / wpf-textbox-trigger?forum = wpf

再舉一個例子。

請看以下出色的文章,其中清楚地描述了與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) {
        ...
    }
}

PS使用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的text屬性綁定到ViewModel的屬性,並監視ViewModel的該屬性(PropertyChanged ?!),而不是將ViewModel函數綁定到View事件。

該屬性更改后,您就可以執行該功能。

這樣,您仍然可以通過依賴於引發事件來測試ViewModel,而無需將其綁定到View。

您的TextEdit控件應綁定到ViewModel中的屬性。 在該屬性的設置器中,您將調用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);
        }
    }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM