Catch按钮点击用户控制

本文关键字:用户 控制 按钮 Catch | 更新日期: 2023-09-27 18:10:13

我有一个带有按钮和用户控件的窗口。当我点击按钮时,触发事件,我想抓住usercontrol。我想这个原理叫做事件隧道。但我也不知道,如果这种方式是正确的方式来捕捉按钮点击事件。

例子
<Window x:Class="EventTunneling.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:uc="clr-namespace:EventTunneling"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
       <Grid.RowDefinitions>
           <RowDefinition Height="30"></RowDefinition>
           <RowDefinition Height="Auto"></RowDefinition>
       </Grid.RowDefinitions> 
        <Button Grid.Row="0" Content="Click me"></Button>
        <uc:Control Grid.Row="1"></uc:Control>
    </Grid>
</Window>

用户控件

<UserControl x:Class="EventTunneling.Control"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
    </Grid>
</UserControl>

现在我想捕获usercontrol的部分类上的事件,这是从主窗口引发的。我怎么能做到呢?

namespace EventTunneling
{
    /// <summary>
    /// Interaction logic for Control.xaml
    /// </summary>
    public partial class Control : UserControl
    {
        public Control()
        {
            InitializeComponent();
        }
    }
}

Catch按钮点击用户控制

不幸的是,你做的都是错误的。首先,需要将集合从后面的代码绑定到DataGrid.ItemsSource属性。然后,当单击Button时,只需在后面的代码中处理它,在那里您可以访问集合并简单地保存它,无论您喜欢:

In UserControl:

<DataGrid ItemsSource="{Binding Items}" ... />

In MainWindow:

<Button Grid.Row="0" Content="Click me" Click="Button_Click" />

后面的代码(你应该在这个属性上实现INotifyPropertyChanged接口):

public ObservableCollection<YourDataType> Items { get; set; }

private void Button_Click(object sender, RoutedEventArgs e)
{
    SaveAsXml(Items);
}

在构造函数后面的代码中(或以你喜欢的任何有效方式设置):

DataContext = this;
    在窗口上创建一个公共事件。
  1. 按钮被点击时触发事件。
  2. 从控件订阅事件

你可以在按钮被点击时调用用户控件中的公共方法:

namespace EventTunneling
{
    public partial class Control : UserControl
    {
      public Control()
      {
          InitializeComponent();
      }
      public void CatchEventOnUserControl()
      {
          //do your job here
          //....
      }
    }
}

然后当按钮被点击时调用CatchEventOnUserControl方法

<Window x:Class="EventTunneling.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:uc="clr-namespace:EventTunneling"
    Title="MainWindow" Height="350" Width="525">
<Grid>
   <Grid.RowDefinitions>
       <RowDefinition Height="30"></RowDefinition>
       <RowDefinition Height="Auto"></RowDefinition>
   </Grid.RowDefinitions> 
    <Button Grid.Row="0" Content="Click me" Click="Button_Click"></Button>
    <uc:Control x:Name="mycontrol" Grid.Row="1"></uc:Control>
</Grid>

后面的代码是

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        mycontrol.CatchEventOnUserControl();
    }
}