如何检测主表单中添加的模板用户控件中的事件
本文关键字:添加 用户 事件 控件 表单 何检测 检测 | 更新日期: 2023-09-27 18:06:14
有一个用户控件模板SubCtrl
,它在构造函数上获得一个id设置一个标签CounterLabelText
,包含:
1复选框1按钮
1 RadNumeric
<Grid Height="27" Width="602">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="533*" />
<ColumnDefinition Width="44*" />
</Grid.ColumnDefinitions>
<Label Margin="26,0,492,0" Content="{Binding CounterLabelText}" />
<CheckBox Height="16" HorizontalAlignment="Left" Margin="7,5,0,0" Name="ChkBxOrder" Width="21" VerticalAlignment="Top" telerik:StyleManager.Theme="Vista" IsManipulationEnabled="True" />
<!--<telerik:RadButton Height="22" HorizontalAlignment="Left" Margin="343,1,0,0" Name="ButtonDoSomething" Width="58" VerticalAlignment="Top" telerik:StyleManager.Theme="Vista" Content="Set Points" Click="ButtonDoSomething_Click" />-->
<telerik:RadNumericUpDown Height="18" HorizontalAlignment="Left" Margin="412,1,0,0" Name="radx" Width="40" VerticalAlignment="Top" IsInteger="True" telerik:StyleManager.Theme="Vista"/>
</Grid>
public partial class SubCtrl : UserControl
{
private string _counterLabelText;
public string CounterLabelText
{
get
{
return _counterLabelText;
}
set
{
_counterLabelText = value;
OnPropertyChanged("CounterLabelText");
}
}
public SubCtrl(int id)
{
InitializeComponent();
CounterLabelText = id.ToString();
DataContext = this;
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
作为用户控件在ADD button
上动态创建,在主表单中传递一个计数器,如
public partial class MainCtrl : UserControl
{
int templateRowsCounter;
//constructor and variables
//...
//...
private void AddTemplate_Click(object sender, RoutedEventArgs e)
{
StackRefinement.Children.Add(new SubCtrl (++templateRowsCounter));
}
private void DelTemplate_Click(object sender, RoutedEventArgs e)
{
//how to remove it based on templateRowsCounter ???
}
}
我有两个问题
- 如何添加删除最后添加的模板DelTemplate_Click() ?
- 有
SubCtrl
与一个复选框,一个按钮和一个radNumeric我怎么知道什么时候ButtonDoSomething_Click()方法必须调用当按下ButtonDoSomething
,以及如何获得复选框和RadNumeric的状态,我的意思是如何检测事件?
更新
SubCtrl类
- 我添加了一个事件ButtonDoSomethingClicked
- 为ButtonDoSomething添加事件处理程序。点击
- 调用ButtonDoSomethingClicked事件处理程序
另外,我更愿意使用DependencyProperty而不是INotifyPropertyChanged,当我有UserControl作为基类,所以修改CounterLabelText也
public partial class SubCtrl : UserControl
{
public event EventHandler ButtonDoSomethingClicked;
public string CounterLabelText
{
get { return (string)GetValue(CounterLabelTextProperty); }
set { SetValue(CounterLabelTextProperty, value); }
}
// Using a DependencyProperty as the backing store for CounterLabelText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CounterLabelTextProperty =
DependencyProperty.Register("CounterLabelText", typeof(string), typeof(SubCtrl), new PropertyMetadata(null));
public SubCtrl(int id)
{
InitializeComponent();
CounterLabelText = id.ToString();
DataContext = this;
ButtonDoSomething.Click += ButtonDoSomething_Click;
}
void ButtonDoSomething_Click(object sender, RoutedEventArgs e)
{
ButtonDoSomethingClicked.Invoke(this, EventArgs.Empty);
}
}
MainCtrl
的代码- 为ButtonDoSomethingClicked添加事件处理程序
- 更新使用templateRowsCounter进行删除。
类代码
public partial class MainCtrl : UserControl
{
int templateRowsCounter;
private void AddTemplate_Click(object sender, RoutedEventArgs e)
{
SubCtrl sub = new SubCtrl(++templateRowsCounter);
sub.ButtonDoSomethingClicked += sub_ButtonDoSomethingClicked;
StackRefinement.Children.Add(sub);
}
private void DelTemplate_Click(object sender, RoutedEventArgs e)
{
SubCtrl sub = (SubCtrl)StackRefinement.Children[--templateRowsCounter];
sub.ButtonDoSomethingClicked -= sub_ButtonDoSomethingClicked;
StackRefinement.Children.Remove(sub);
}
void sub_ButtonDoSomethingClicked(object sender, EventArgs e)
{
//your do something logic
}
}
所以这个例子提出了ButtonDoSomethingClicked,其余的也可以用同样的方式实现。ButtonBase。在不能修改代码的时候点击也很有用,也是比较通用的方法。
以前这是你对问题1的快速解决方案
private void DelTemplate_Click(object sender, RoutedEventArgs e)
{
//remove last added template, advisable to check if exists before deleting it
StackRefinement.Children.RemoveAt(StackRefinement.Children.Count - 1);
}