我有一些解决方案(由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。因此,如果父母从未“创造”儿童控制,它是如何意识到它的?
答案 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}}}