C# 捕捉按钮单击用户控件

C# 捕捉按钮单击用户控件,c#,wpf,C#,Wpf,我有一个带有按钮和用户控件的窗口。现在,当我点击按钮,引发的事件,我想捕捉usercontrol。我猜这个原理叫做事件隧道。但我也不知道,这种方式是否是捕捉按钮点击事件的正确方式 范例 <Window x:Class="EventTunneling.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.micr

我有一个带有按钮和用户控件的窗口。现在,当我点击按钮,引发的事件,我想捕捉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();
        }
    }
}
名称空间事件隧道
{
/// 
///Control.xaml的交互逻辑
/// 
公共部分类控件:UserControl
{
公共控制()
{
初始化组件();
}
}
}
  • 在窗口上进行公开活动
  • 单击按钮时激发事件
  • 从控件订阅事件

  • 您只需在单击按钮时调用用户控件中的公共方法即可:

    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>
    

    不幸的是,你做错了。首先,您需要将收集的数据从代码隐藏绑定到
    DataGrid.ItemsSource
    属性。然后,单击
    按钮
    时,只需在“代码隐藏”中处理它,您就可以访问该集合,并只需按自己喜欢的方式保存它:

    用户控件中

    <DataGrid ItemsSource="{Binding Items}" ... />
    
    在代码隐藏中(应在此属性上实现
    INotifyPropertyChanged
    接口):

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


    你为什么要这么做?你到底想实现什么?我在usercontrol上有一个datagrid,还有一个对象集合作为这个datagrid的datacontext。在主窗口上我有一个保存按钮。当我单击save按钮时,我想将对象集合保存为一个datagrid作为xml。
    <DataGrid ItemsSource="{Binding Items}" ... />
    
    <Button Grid.Row="0" Content="Click me" Click="Button_Click" />
    
    public ObservableCollection<YourDataType> Items { get; set; }
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SaveAsXml(Items);
    }
    
    DataContext = this;