2014-12-04 67 views
0

我一直在使用WPF,並遇到了與DataTemplates相關的問題。 我有一個叫做DetailPage.xaml的視圖,該視圖使用了一個名爲Detail.xaml的DataTemplate。我向這個DataTemplate添加了一個文本框,我想處理TextChanged事件。所以我做了這樣的事情:DataTemplate中WPF控件的事件處理程序

<DataTemplate x:Name="DetailContent"> 
    <Grid Margin="5" DataContext="{Binding Items[0]}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition MaxHeight="80"/> 
     </Grid.RowDefinitions> 
     <StackPanel Width="432"> 
      <TextBox Name="NumeroParadaTB" Text="{Binding NumeroParada}" MaxLength="5" TextChanged="NumeroParadaTB_TextChanged" /> 
     </StackPanel> 
    </Grid> 
</DataTemplate> 

然後創建和事件處理程序DetailPage.xaml.cs,如下所示:

protected async void NumeroParadaTB_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     string nroParada = ((TextBox)sender).Text; 

     if(!string.IsNullOrEmpty(nroParada) && nroParada.IsDigitsOnly() && nroParada.Length == 5) 
     { 

     } 
    } 

但是運行的時候,並拋出錯誤,指出事件處理程序不存在。我想我以錯誤的方式使用事件處理程序。

謝謝!

+0

如果您使用數據綁定,爲什麼要處理'TextChanged'?爲什麼不在數據上下文中處理'NumeroParada'屬性更改? – Dennis 2014-12-04 13:23:19

+0

對不起丹尼斯,我是WPF的noob。你有一個可以幫助我實現這個目標的例子嗎? – 2014-12-04 13:25:18

+0

是否要驗證輸入的文本值並顯示驗證結果? – Dennis 2014-12-04 13:41:50

回答

2

由於您使用數據綁定,我認爲,你有一些類NumeroParada屬性:

public class SomeClass : INotifyPropertyChanged 
{ 
    /* other code here */ 

    public string NumeroParada 
    { 
     get { return numeroParada; } 
     set 
     { 
      if (numeroParada != value) 
      { 
        numeroParada = value; 
        OnPropertyChanged("NumeroParada"); 
      } 
     } 
    } 
    private string numeroParada;  
} 

這個屬性的二傳手會火,當UI將更新綁定源。這是你的「TextChanged」事件。

請注意,在失去焦點時,默認情況下,TextBox更新Text屬性。如果您想在用戶更改文字時執行任何操作,請更新您的綁定定義:

Text="{Binding NumeroParada, UpdateSourceTrigger=PropertyChanged}" 

到目前爲止這麼好。但是這個代碼:

if(!string.IsNullOrEmpty(nroParada) && nroParada.IsDigitsOnly() && nroParada.Length == 5) 

暗示,您正試圖執行用戶輸入的值驗證。 在WPF驗證是一個相當大的主題,我建議你閱讀一些像this這樣的選擇驗證方法。

+0

謝謝丹尼斯!這真的很有用:) – 2014-12-04 14:08:26

0

您可以使用事件到命令邏輯來代替添加事件處理程序。在ViewModel中創建一個命令並將其綁定到TextChanged事件。

 <TextBox Text="{Binding SearchText, Mode=TwoWay}"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="TextChanged"> 
        <i:InvokeCommandAction Command="{Binding MyCommand}" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </TextBox> 

System.Windows.Interactivity程序集中可用的交互觸發器。

+0

雖然有理由使用交互觸發器,但事實並非如此。沒有必要從字面上理解這個問題。 – Dennis 2014-12-04 14:01:31

相關問題