2012-02-14 3 views
0

У меня есть следующий код XAML:WPF TextBox Trigger

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4" 
    x:Class="WpfApplication4.MainWindow" 
    Title="MainWindow" Height="350" Width="525"> 
<StackPanel> 
    <TextBox Margin="89,116,69,123" x:Name="txtFilter" Background="AliceBlue" > 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="TextChanged"> 
       <cmd:EventToCommand Command="{Binding MyClass:SearchedTextChanged}" CommandParameter="{Binding Text, ElementName=txtFilter}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </TextBox> 
    <TextBox Width="100" Background="AntiqueWhite"> 
    </TextBox> 

И код выглядит следующим образом:

public partial class MainWindow: Window 

{ 
     public MainWindow() 
{ 

InitializeComponent(); 


} 
} 

public class MyClass : MainWindow 

{ 
public RelayCommand<string> SearchedTextChanged { get; set; } 



MyClass() 
     { 
      SearchedTextChanged = new RelayCommand<string>(OnSearchedTextChanged); 
      DataContext=this; 

     } 

     private void OnSearchedTextChanged(string val) 
     { 
      if (val != null) 
      { 
       System.Diagnostics.Debug.WriteLine(val); 
      } 
     } 


} 

MainWindow является класс, который является производным от window.But его не попадает, когда текст изменяется в текстовом поле. Однако, если приведенный выше код является wriiten в классе mainwindow, он отлично работает.

ответ

0

его намного проще просто привязать к свойству Text вместо использования триггера. вам просто нужно установить UpdateSourceTrigger в PropertyChanged. если вы это сделаете, каждый раз, когда вы вводите текст в текстовое поле, он будет устанавливать свойство SearchText в вашей модели viewmodel.

<TextBox Text="{Binding SearchText,UpdateSourceTrigger=PropertyChanged }"/> 

ViewModel или что-то подобное

public class SearchVM 
{ 
    private string searchtext; 

    public string SearchText 
    { 
     get{return this.searchtext;} 
     set{this.seachtext = value; //INotifyPropertyChanged should be implemented to 
     } 
    } 
} 

MainWindow: Вы должны установить DataContext!

public partial class MainWindow: Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new SearchVM(); 
    } 
} 

код написан на бумаге, но должен принять вас в правильном направлении.

ps: прочитайте о привязке данных, datacontext и MVVM