![](/img/trans.png)
[英]How to access usercontrol (toolbar) from ViewModel in MVVM?
[英]How do you access a nested usercontrol viewmodel from the parent
我有一個用戶控件,說一個鍵盤,我想在其他幾個控件中重復使用。 鍵盤響應INotifyPropertyChanged,但我想捕獲父控件中的更改以更新其中的文本框。
我試圖從父視圖模型訪問控件,但這不是使用MVVM執行此操作的正確方法。
任何想法表示贊賞。
我想說的是,如果您想使用MVVM樣式,那么鍵盤控件應該公開ICommand屬性,該屬性由父級提供的命令本身,並在單擊任何鍵時執行該命令。
該命令將在命令參數中單擊鍵。
實際的命令實現將在父控件中(您可以使用RelayCommand模式 ),然后可以更新其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;
}
...
}
我想您有點混在一起。
MVVM方式將是具有兩個視圖模型和兩個視圖。
MasterControlViewModel
和MasterControlView
KeypadControlViewModel
和KeypadControlView
MasterControlViewModel
將訂閱在KeypadControlViewModel
觸發的鍵事件。
但是,您似乎在推斷KeypadControl
只是一個標准控件,沒有它自己的viewmodel。 考慮到它與視圖的緊密聯系,這是有道理的(它提供鍵盤輸入,插入位置取決於光標所在的位置,等等)。 如果是這種情況, KeypadControl
具有“ Target”依賴項屬性,該屬性可以綁定到MasterControlView
的編輯控件。 單擊某個鍵時, KeypadControl
只會更新目標控件,或者可能會更好,它可以觸發鍵盤RoutedEvents,就像實際的鍵盤事件一樣,它會在視覺樹上傳播,從而放棄了對target屬性的需求。
這樣,您所有的輸入內容都將在視圖中得到處理,而MasterControlViewModel
只關心字符串已更改的事實。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.