簡體   English   中英

如何從父級訪問嵌套的usercontrol視圖模型

[英]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方式將是具有兩個視圖模型和兩個視圖。

MasterControlViewModelMasterControlView

KeypadControlViewModelKeypadControlView

MasterControlViewModel將訂閱在KeypadControlViewModel觸發的鍵事件。

但是,您似乎在推斷KeypadControl只是一個標准控件,沒有它自己的viewmodel。 考慮到它與視圖的緊密聯系,這是有道理的(它提供鍵盤輸入,插入位置取決於光標所在的位置,等等)。 如果是這種情況, KeypadControl具有“ Target”依賴項屬性,該屬性可以綁定到MasterControlView的編輯控件。 單擊某個鍵時, KeypadControl只會更新目標控件,或者可能會更好,它可以觸發鍵盤RoutedEvents,就像實際的鍵盤事件一樣,它會在視覺樹上傳播,從而放棄了對target屬性的需求。

這樣,您所有的輸入內容都將在視圖中得到處理,而MasterControlViewModel只關心字符串已更改的事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM