簡體   English   中英

文本框與觸發器綁定

[英]Textbox binding with trigger

我需要將文本框與上面可用的數據綁定,並執行與此相關的命令。 我只希望在按下鍵盤上的“ Enter”按鈕時輸入數據以及命令執行。 我習慣了下面的代碼,但是看來,我在不按“ Enter”的情況下執行命令,也發現對於每個按下的數字或文本,我都在獲取命令。 我不希望這種情況發生。

我的InputDataTemplate.xaml代碼:

<Label Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Content="{Binding Name}" />
<Label Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Center" Content="{Binding Value}" />
<TextBox Grid.Column="1" Width="60" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Data}" DataContext="{Binding}" >
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="TextChanged" >
                        <ei:CallMethodAction TargetObject="{Binding}" MethodName="IpDataTrig" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBox>

我可以理解EventName =“ TextChanged”在這里起作用。 但是不確定其他東西。

我的TesterView.xaml代碼:

<UserControl.Resources>
    <DataTemplate x:Key="InputDataTemplate" >
        <local:InputDataTemplate DataContext="{Binding}" />
    </DataTemplate>
</UserControl.Resources>

<Grid Grid.Row="2" Background="AliceBlue" >
    <Label Content="Input Datas" FontWeight="Bold"
               HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
<Border Grid.Row="3" BorderBrush="Black" BorderThickness="0,2,0,0" >
    <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled" >
        <ItemsControl x:Name="IpDataNames" 
                      DataContext="{Binding }"
                      ItemsSource="{Binding IpDataNames}"
                      ItemTemplate="{DynamicResource InputDataTemplate}" />
    </ScrollViewer>
</Border>

我的TesterViewModel.cs:

private ObservableCollection<InputDataService> _IpDataNames;
private InputDataService l_IpDataNames;

 _IpDataNames = new ObservableCollection<InputDataService>();

public ObservableCollection<InputDataService> IpDataNames
        {
            get { return _IpDataNames; }
            set
            {
                IpDataNames = value;
            }
        }

InputDataService.cs:

public class InputDataService : BindableBase
    {
        public string Name { get; set; }
        public string Value { get; set; }
        public string Data { get; set; }

        public void IpDataTrig()
        {
            Debug.WriteLine(string.Format("\nInput Data {0} Updated : {1} : {2}", Name, Data, Value));
        }
    }

可能重復的問題: https : //stackoverflow.com/a/10466285/475727

順便說一句,捕獲KeyPress事件並從代碼隱藏中調用命令沒有錯。 它不違反MVVM模式。

有時我會使用自己的行為作為附加屬性來實現。 最大的優點是,我可以在樣式中使用它。 此行為更新文本屬性上的綁定源,然后調用命令。 (默認情況下,TextBox.Text綁定在losf焦點上更新)

public static class TextBoxBehaviour
{
    public static readonly DependencyProperty CommandOnEnterPressedProperty = DependencyProperty.RegisterAttached("CommandOnEnterPressed",typeof (ICommand),typeof (TextBoxBehaviour),
            new FrameworkPropertyMetadata(CommandOnEnterPressedPropertyChanged));

    private static void CommandOnEnterPressedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var sender = (TextBox) d;
        sender.KeyDown -= OnKeyDown;

        if (e.NewValue is ICommand)
        {
            sender.KeyDown += OnKeyDown;
        }
    }

    private static void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            var tbx = (TextBox) sender;
            var textBindigExpression = tbx.GetBindingExpression(TextBox.TextProperty);
            if (textBindigExpression != null)
            {
                textBindigExpression.UpdateSource();
            }
            var command = GetCommandOnEnterPressed(tbx);
            if (command.CanExecute(null)) command.Execute(null);
        }
    }

    [AttachedPropertyBrowsableForType(typeof(TextBox))]
    public static void SetCommandOnEnterPressed(TextBox elementName, ICommand value)
    {
        elementName.SetValue(CommandOnEnterPressedProperty, value);
    }

    public static ICommand GetCommandOnEnterPressed(TextBox elementName)
    {
        return (ICommand) elementName.GetValue(CommandOnEnterPressedProperty);
    }
}

和用法

<TextBox Text="{Binding SearchTerm, UpdateSourceTrigger=Explicit}" 
         my:TextBoxBehaviour.CommandOnEnterPressed="{Binding SearchCommand}"/>

暫無
暫無

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

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