簡體   English   中英

從不同的來源收聽同一事件

[英]Listening to the same Event from different sources

我只是想知道C#/ WPF是否有一個“語法糖化”變體來收聽來自不同來源的同一事件。 我為給定事件設置了一個處理程序,並且我想讓更多的控件在使用相同處理程序的同時偵聽同一事件。

少說話,多代碼。 這是我想要實現的目標:

// Presuming pEnable is a parameter, a simple bool
if (pEnable) SomeControl.MouseDown += MyMouseDownEventHandler
        else SomeControl.MouseDown -= MyMouseEventHandler;

// How can I avoid repeating the snippet from above?
// E.g. Do the same for SomeOtherControl, ThisOtherControl and so on

整個三元運算符都可以解決,我只想發布我正在考慮的整個代碼片段。 如果它們看起來很粗略,我可以提供其他任何細節。

提前致謝!

更新:

事實證明,由於我綁定到一個錯誤事件,因此在我的情況下,提出的解決方案(見下文) TreeView 。在TreeView的情況下,這應該是PreviewMouseDownEvent ,而不是簡單的MouseDown事件。

除此之外,通過使用RoutedEvent這里概述),還可以使用AddHandlerRemoveHandler 有關此問題的更多信息。 再次感謝您的輸入!

您能否將其重構為以控件為參數的方法?

void Listen(UIElement element)
{
    if (pEnable) element.MouseDown += MyMouseDownEventHandler
            else element.MouseDown -= MyMouseEventHandler;
}

同樣,這些事件路由事件 ,您可以在一個共同祖先上處理該事件,然后查看事件的根源是如何采取相應措施。

由於您使用的是WPF,因此最好的辦法是對這些事件使用MVVM樣式綁定,然后將XAML中的MouseDown事件綁定到相應視圖模型上的相同方法。 這將使您可以從背后的代碼中刪除所有這些代碼,並利用WPF的豐富綁定上下文。

然后,您可以進一步走一步,對共享相同事件實現的控件進行模板化,從而不必在整個XAML中重復所有綁定。

暫無
暫無

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

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