C# 可重用用户控件中的按钮

C# 可重用用户控件中的按钮,c#,winforms,mvvm,C#,Winforms,Mvvm,我有一个UserControl,我想在一个页面中多次重复使用它。我找到了一个,但有一个转折点:如果我的控件中有一个TextBox,我可以将单个属性公开,如下所示: public string FirstName { get { return privateTextBox.Text; } set { privateTextBox.Text = value; } } 从我的主视图(具有视图模型)访问该属性,如下所示: MyUserControl personUserControl= n

我有一个UserControl,我想在一个页面中多次重复使用它。我找到了一个,但有一个转折点:如果我的控件中有一个
TextBox
,我可以将单个属性公开,如下所示:

public string FirstName
{
   get { return privateTextBox.Text; }
   set { privateTextBox.Text = value; }
}
从我的主视图(具有视图模型)访问该属性,如下所示:

MyUserControl personUserControl= new MyUserControl();
personUserControl.FirstName = viewModel.FirstName;
这是我的问题:如果自定义用户控件中有一个按钮,我想访问该按钮,该怎么办。我可以访问它的属性,就像文本框一样,但是事件(主要是
单击
事件)呢

目前,我最好的解决方案是调用委托事件,该事件被(主视图的)视图模型捕获,然后调用另一个事件,但这似乎是一个相当糟糕的设计

是否无法以类似于属性访问的方式从用户控件访问事件?

不,我把MVVM和WinForms混合在一起不是一个错误。这是有意的(聪明与否)


编辑:这个问题与WinForms(据我所知)关系不大,而是与使用多层用户控件有关。这就产生了一个问题:我应该通过UserControls的多层从上到下传递ViewModel,还是应该向上传递UserControls的属性?

您可以以处理其他属性的几乎相同的方式公开事件:

private Button myButton;

public event EventHandler MyButtonClick
{
    add { myButton.Click += value; }
    remove { myButton.Click -= value; }
}

您可以以处理其他属性的几乎相同的方式公开事件:

private Button myButton;

public event EventHandler MyButtonClick
{
    add { myButton.Click += value; }
    remove { myButton.Click -= value; }
}

您可以使用与属性相同的方式使事件在控件外部可见。@PawełŁukasik您能举个例子吗?我不知道该写什么(例如,smth类似于
公共按钮\u Click myClickEvent
,除非它应该工作),而是
公共事件处理程序myClickEvent但如果您使用的是MVVM,则可能会使用@fabio的answerI混合MVVM和WinForms。这是有意的(聪明与否)-绝对不是错误,Winforms非常支持MVVM(数据绑定)。功能不如WPF强大,但可以在Winforms中使用,甚至可以在WPF中使用相同的视图模型。您的可能副本可以使事件在控件外可见,方式与使用属性时相同。@Pawełukasik您能举个例子吗?我不知道该写什么(例如,smth类似于
公共按钮\u Click myClickEvent
,除非它应该工作),而是
公共事件处理程序myClickEvent但如果您使用的是MVVM,则可能会使用@fabio的answerI混合MVVM和WinForms。这是有意的(聪明与否)-绝对不是错误,Winforms非常支持MVVM(数据绑定)。没有WPF强大,但可以在Winforms中使用,甚至也可以在WPF中使用相同的viewmodels。的可能重复