如何检测主表单中添加的模板用户控件中的事件

本文关键字:添加 用户 事件 控件 表单 何检测 检测 | 更新日期: 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 ???
    }
}

我有两个问题

  1. 如何添加删除最后添加的模板DelTemplate_Click() ?
  2. 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);
}