Как вызвать метод в элементе XAML при изменении текстового свойства - PullRequest
0 голосов
/ 04 февраля 2020

Я действительно не знаю, как искать, чтобы найти решение этой проблемы (я много гуглил, может быть, я слепой ...).

У меня есть ComboBox, который также содержит TextBox. ComboBox создается в отдельном Control.xaml с указанным c DataContext, где он получает свое содержимое для всплывающего списка. Теперь, когда я что-то печатаю в TextBox, я хочу вызвать метод, который затем фильтрует список моего DataContext для указанных элементов c. Итак, мой ComboBox.cs имеет следующее содержимое:

    public event EventHandler FilterTextChanged;

    protected virtual void OnFilterTextChanged(EventArgs args)
    {
      FilterTextChanged?.Invoke(FilterText, args);
    }

    public string FilterText
    {
      get { return _filterText; }
      set
      {
        //This point is reached when I type something into the TextBox within the ComboBox
        if (_filterText == value) return;
        _filterText = value;
        OnFilterTextChanged(EventArgs.Empty);
        OnPropertyChanged("FilterText");
      }
    }

И в моем Control.xaml я настроил его так:

<my:ComboBox x:Name="FURecipeComboBox"
             AuthorizationMode="IsEnabled"
             IsTextSearchEnabled="False"
             StaysOpenOnEdit="True"
             FilterTextChanged="FURecipeComboBox_OnFilterTextChanged"
             ItemsSource="{Binding RecipeFileNames}"
             SelectedItem="{Binding Value, Delay=100, ElementName=AlphaNumericTouchpadTextVarIn}"
             d:DataContext="{d:DesignInstance {x:Type adapter:ToolRecipeVariableInfo}, IsDesignTimeCreatable=False}">
</my:ComboBox>

Но я просто не могу получить его, чтобы перехватить событие «FilterTextChanged», и мой метод «FURecipeComboBox_OnFilterTextChanged» не будет достигнут в любое время ... Я был бы очень рад некоторым подсказкам или помощи!

С уважением, BB

1 Ответ

0 голосов
/ 04 февраля 2020

Посмотрите RoutedEvents на документы Microsoft

Это пример сообщения из Stackoverflow

В вашем случае попробуйте изменить EventHandler на RoutedEventHandler.

Я сделал небольшой пример:

Main.xaml

<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <local:UserControl1  HorizontalAlignment="Left" Height="207" Margin="348,175,0,0" VerticalAlignment="Top" Width="311" MyClick="UserControl1_MyClick"/>

</Grid>

Main.cs

using System.Windows;


namespace WpfApp1
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void UserControl1_MyClick(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Yep");
        }
    }
}

control.cs

public partial class UserControl1 : UserControl
{
    public event RoutedEventHandler MyClick;

    public UserControl1()
    {
        InitializeComponent();
    }

    private void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        if(e.Key == Key.Enter)
        {
            if (MyClick != null)
                MyClick(this, new RoutedEventArgs());
        }
    }
}

control.xaml

<UserControl x:Class="WpfApp1.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:WpfApp1"
         mc:Ignorable="d" 
         d:DesignHeight="372.313" d:DesignWidth="350">
<Grid>
    <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="218" Margin="59,54,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="202" KeyDown="textBox_KeyDown"/>

</Grid>

...