0

我为此提供了一些解决方案(由 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;
    }

我了解(排序)MVVM 模式并不真正希望 ViewModel 访问视图。因此,如果父级从不“创建”子级控件,它是如何意识到的呢?

4

2 回答 2

1

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

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

编辑:

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

子视图 -> 子视图模型 -> 父视图模型 -> 父视图

所以让子视图改变子视图模型。确保父视图模型正在侦听通知其更改的事件,并让父视图从那里侦听父视图模型。

于 2012-11-13T12:33:25.883 回答
0

哦,我悲伤的麻袋。您可以命令绑定链。

它没有 100% 回答我的问题,但教会了我。

Command={Binding Parent.DataContext.SomeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}
于 2012-11-13T14:00:54.467 回答