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();
}
}
}
不幸的是,你做的都是错误的。首先,需要将集合从后面的代码绑定到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;
- 在窗口上创建一个公共事件。
- 按钮被点击时触发事件。
- 从控件订阅事件
你可以在按钮被点击时调用用户控件中的公共方法:
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();
}
}