在嵌套用户控件中处理事件的最佳方法

时间:2010-07-20 07:53:37

标签: wpf user-interface design-patterns

我是GUI开发的新手,尤其是WPF,并且不了解相关模式。所以我想问你一个不时出现的问题,我不确定它的最佳解决方案。

让我们有三个用户控件A,B,C和控件A包括控件B,控件B包括控件C.让控件C有一个按钮。必须使用A类中的数据来解决此事件的click事件。我看到以下可能的方法来排除这种情况:

1)将方法InnerButtonClick(对象发送者,RoutedEventArgs e)添加到A类,这将解决由我们的按钮引起的冒泡事件。劣势:

i)此方法将捕获来自A的孩子的所有button.click事件。所以我必须在方法中实现一些条件逻辑,以便检查事件是否由我们的按钮引起。

ii)在那里获得C的属性并不容易。它可能看起来像

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

如果按钮位于用户控件C中的StackPanel和StackPanel中。

2)提供对C类必要数据的访问。例如,将数据传递给B类,然后传递给C.减少:

i)通常不那么容易。

ii)它会导致额外的方法/构造函数参数。

3)在A类中创建一个静态方法,可以通过C类方法调用。 劣势:

i)看起来有点不愉快。这是单身的方式,来自“力量的黑暗面”的模式)

1 个答案:

答案 0 :(得分:1)

RoutedCommands正是针对这种情况。在C中的按钮上设置命令,并向A添加一个CommandBinding,A不需要知道C,C不需要知道任何关于A的方法。单击C中的按钮时,该命令将冒泡到它找到的第一个命令绑定,在您的情况下将为A.

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