如何从父级访问嵌套的usercontrol视图模型

时间:2012-11-13 08:22:27

标签: c# wpf mvvm

我有一个用户控件说我想在其他几个控件中重用的键盘。键盘响应INotifyPropertyChanged,但我想捕获父控件中的更改以更新其中的文本框。

我试图从父视图模型访问控件,但这不是使用MVVM执行此操作的正确方法。

任何想法都赞赏。

2 个答案:

答案 0 :(得分:0)

我想说,如果你想做MVVM风格,那么键盘控件应该公开一个ICommand属性,使用父本提供的命令本身,并在点击一个键时执行该命令。

该命令将在命令参数中单击该键。

实际的命令实现将在父控件中(您可以使用RelayCommand pattern),然后可以更新其TextBox。

键盘类应包含以下内容:

class Keypad : UserControl
{
     ...
     public DependencyProperty OnKeypadKeyClickedCommandProperty = ... ;
     ...
     void OnZeroButtonClicked(object sender, RoutedEventArgs e)
     {
         OnKeypadKeyClickedCommand.Execute(this, new SomeKeyIdentifier('0'));
     }
     ...
}

XAML应包含以下内容:

<local:Keypad OnKeypadKeyClickedCommand="{Binding HandleKeypadKeyClickCommand, ElementName=parentControlName}" />

父控件中的实现应如下所示:

class ParentControl : ...
{
    DependencyProperty HandleKeypadKeyClickCommand = ...;

    void Init()
    {
        HandleKeypadKeyClickCommand = new RelayCommand(new Action<SomeKeyIdentifier>(DoKeyPress));
    }
    ...
    void DoKeyPress(SomeKeyIdentifier key)
    {
         _Textbox.Text += key.Char;
    }
    ...
}

答案 1 :(得分:0)

我认为你有点想法。

MVVM的方式是拥有两个视图模型和两个视图。

MasterControlViewModel&amp; MasterControlView

KeypadControlViewModel&amp; KeypadControlView

MasterControlViewModel会订阅KeypadControlViewModel中触发的关键事件。

但是,您似乎在推断KeypadControl只是一个标准控件,没有自己的viewmodel。鉴于它与视图的密切关系(它提供键盘输入,其中插入将取决于光标的位置等),这将是有意义的。如果是这种情况,KeypadControl可能更适合拥有可以绑定到MasterControlView中的编辑控件的“目标”依赖项属性。当点击一个键时,KeypadControl只是更新目标控件,或者更好的是,它可能会触发键盘RoutedEvents,它会像真正的键盘事件一样向上移动到视觉树上,而这需要放弃目标属性。

这样,您在视图中处理所有输入内容,而MasterControlViewModel只关心字符串已更改的事实。