我有一个用户控件说我想在其他几个控件中重用的键盘。键盘响应INotifyPropertyChanged,但我想捕获父控件中的更改以更新其中的文本框。
我试图从父视图模型访问控件,但这不是使用MVVM执行此操作的正确方法。
任何想法都赞赏。
答案 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
只关心字符串已更改的事实。