在子控件上注册和处理事件处理程序并在父级上捕获事件

时间:2012-11-13 12:25:22

标签: c# wpf mvvm

我有一些解决方案(由Stack Exchange Guru提供),但我很好奇如何正确实现这一点,因为我已经读过一个选项是在子控件中创建一个事件并订阅/收听它在父母身上。

我有一个子控件,其中onPropertyChanged成功触发:

public class KeypadEventArgs : EventArgs
    {
        public KeypadEventArgs(double result)
        {
            Result = result;
        }

        public double Result { get; set; }
    }

protected void OnPropertyChanged(string name)
    {
        switch (name)
        {
            case "Result":                    
                    KeyUpdated(this, new KeypadEventArgs(Result));
                break;
        }
    }

它被添加到XAML中的主机控件中,如下所示:

<UserControl:KeypadView Width="200" Height="300" Visibility="Collapsed" />

现在我希望主机/父控件订阅子控件的KeyUpdated事件:

类似的东西:

this.keypadViewModel.KeyUpdated += this.OnKeyUpdated;
...
private void OnKeyUpdated(object sender, KeypadViewModel.KeypadEventArgs e)
    {
        value = e.Result;
    }

我理解(sorta)MVVM模式并不真正希望ViewModel访问View。因此,如果父母从未“创造”儿童控制,它是如何意识到它的?

2 个答案:

答案 0 :(得分:1)

我可能会稍微误解这里的模式,但我认为父母应该拥有自己的ViewModel来监听子ViewModel。当孩子改变它的ViewModel时,会通知父母的ViewModel并且父母的视图会相应地更新。

但就像我说的那样,我可能会误会。

修改

基本上它应该像这样工作:

儿童观 - &gt;儿童视图模型 - &gt;父视图模型 - &gt;父视图

让Child View改变子视图模型。确保父视图模型正在侦听一个事件,该事件通知它更改并让父视图从那里监听父视图模型。

答案 1 :(得分:0)

哦,我伤心难过的麻袋。你可以命令绑定链。

它不是100%回答我的问题,而是教会了我。

Command={Binding Parent.DataContext.SomeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}