2014-09-12 7 views
0

J'ai mes fichiers view et viewmodel. Dans mon viewmodel, j'ai ce code simplement:WPF MVVM: commande de liaison à l'événement

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********"); 
} 

Dans mon XAML je:

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

QUESTION DUMB: comment puis-je lier ma fonction à l'événement EditValueChanged, en passant comme également paramètre le contenu de la zone de texte? le but simple est: lorsque l'utilisateur écrit quelque chose dans la zone de texte, filtrez la collection liée au viewmodel.

En ligne J'ai trouvé beaucoup de tutoriel, d'extraits de code et ainsi de suite, mais n'importe lequel d'entre eux m'aide à comprendre.

+0

Si vous voulez que cela se produise sur un événement, alors vous devrez utiliser un déclencheur, mais si vous voulez qu'il se produise dans un clic de bouton, vous pouvez utiliser une commande. –

+0

Je veux que ça se passe sur un événement! Comment puis-je utiliser le déclencheur? –

+0

s'il vous plaît vérifier si la réponse donnée ci-dessous est ce que vous avez besoin. –

Répondre

2

cela peut être fait avec quelque chose de similaire.

Par exemple: -

<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> 

regard sur

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

pour autre exemple.

+0

vous aurez également besoin de l'interaction.dll pour que cela fonctionne. –

-2

Votre contrôle TextEdit doit être lié à une propriété dans le ViewModel. Dans le setter de cette propriété, vous appelez la méthode Filter.

Cet exemple part du principe que votre contrôle TextEdit possède une propriété Text. Si ce n'est pas le cas, changez pour lier à quel que soit le nom de la propriété.

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

Puis dans la classe ViewModel:

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

Ceci est une mauvaise pratique. Les setters de propriétés ne doivent pas appeler des opérations potentiellement longues comme celle-ci. – slugster

+0

et ainsi, quelle est la bonne façon? =) –

+0

@slugster Qu'est-ce qui vous fait supposer que c'est une opération de longue durée? Rien à cet effet n'a été indiqué dans la question. – user469104

0

lieu de lier la fonction ViewModel à l'événement de la vue, vous pouvez lier la propriété texte du TextEdit à une propriété du ViewModel et de surveiller cette propriété de le ViewModel (PropertyChanged ?!).

Dès que cette propriété change, vous pouvez exécuter la fonction. De cette façon, vous pouvez toujours tester le ViewModel sans le lier à la vue en vous appuyant sur l'événement déclenché.

+0

pouvez-vous me montrer un exemple de code? –

2

Jetez un coup d'œil au bon article suivant qui décrit clairement tous les aspects liés à l'implémentation DevExpress du comportement EventToCommand: DevExpress MVVM Framework. EventToCommand.. Avec l'aide de cette approche, vous pouvez mettre en œuvre votre tâche comme suit:

<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) { 
     ... 
    } 
} 

post-scriptum En utilisant les contrôles DevExpress, vous pouvez effectuer le filtrage des éléments de contrôle de la liste de contrôle via une boîte de recherche sans aucune codification. Il suffit de lier la propriété ListBoxEdit.FilterCriteria à la propriété 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> 

Vous pouvez jouer avec cette approche en utilisant les following demo (le lien pointe vers la version Silverlight, mais la version WPF se comporte exactement de la même). Vous pouvez utiliser la même approche avec n'importe quel contrôle de liste de DX (ListBoxEdit, ComboBoxEdit, DXGrid, etc.

Questions connexes