2010-07-20 51 views
1

我是GUI开发人员的新手,特别是使用WPF,并且不知道相关模式。所以我想问你一个不时出现的问题,我不确定最好的解决方案。在嵌套用户控件中处理事件的最佳方式

让我们有三个用户控件A,B,C和控件A包含控件B,控件B包含控件C.让控件C有一个按钮。这个点击事件必须使用来自A类的数据来解决。我看到以下可能的方式来排序这种情况:

1)将方法InnerButtonClick(object sender,RoutedEventArgs e)添加到类A由我们的按钮引起的冒泡事件。缺点:

i)此方法将捕获A的孩子的所有button.click事件。所以我将不得不在方法中实现一些条件逻辑,以检查事件是否由我们的按钮引起。 ii)要在那里获得C的属性并不容易。它可能看起来像

 var btn = (Button)e.OriginalSource; 
     string userName = ((ActionButtons)((UserControl)((StackPanel)btn.Parent).Parent)).UserName; 

如果按钮处于StackPanel中和的StackPanel在用户控制下

2)提供的类C.例如必要的数据访问,数据传递给所述B类,然后C. C.缺陷:

我)它往往不是那么容易。 ii)它会导致额外的方法/构造函数参数。

3)在A类中创建一个静态方法,该方法可以由C类方法调用。 缺点:

i)看起来有点不愉快。这是单身人士的方式,来自'黑暗部队'的模式)

回答

1

RoutedCommands正好适用于这种类型的场景。在C中的按钮上设置命令,并将一个CommandBinding添加到A中,A不需要知道C,并且C不需要知道关于A的任何内容。当点击C中的按钮时,该命令会冒泡到找到的第一个命令绑定,在您的情况下这将是A.

编辑:
您可以使用CommandParameter属性从文本框中传递文本。 如果您需要传递更多的信息而不仅仅是一个字段,您可以处理C中的按钮单击事件,将必要的数据收集到一个对象中,然后从该对象的代码触发命令作为参数。

+0

对不起,我误读了那一点。请参阅编辑的回复。 – Bubblewrap 2010-07-20 09:17:42

+0

谢谢。这听起来不错 – 2010-07-20 09:26:29

相关问题