繁体   English   中英

DataTemplate中WPF控件的事件处理程序

[英]Eventhandler for WPF control in DataTemplate

我一直在使用WPF,但遇到了与DataTemplates相关的问题。 我有一个名为DetailPage.xaml的视图,该视图使用了一个名为Detail.xaml的数据模板 我向此DataTemplate添加了一个文本框,并且我想处理TextChanged事件。 所以我做了这样的事情:

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

        }
    }

但是在运行时,抛出错误并指出事件处理程序不存在。 我想我以错误的方式使用了事件处理程序。

谢谢!

由于您正在使用数据绑定,因此我假设您有一些具有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是相当大的主题,我建议你阅读像这样选择验证方法。

您可以使用“事件到命令”逻辑来代替添加事件处理程序。 在ViewModel中创建一个Command并将其绑定到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程序集中提供了交互触发器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM