[英]Attach event handler from parent class in xaml
我有一個窗口的基類,其中包含我此類窗口常見的一些事件處理程序(它們觸發常見的驗證方法)。
這是一個示例事件處理程序:
protected virtual void ValidateTextBoxTextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
ValidateProperty((FrameworkElement)sender, TextBox.TextProperty);
}
其中大約有20個,涵蓋了共同控制。
每個窗口實例都是從基類的子類構建的。 在子類的.xaml中我做了:
<TextBox
TextChanged="ValidateTextBoxTextChanged"/>
但是當我導航到這個窗口時,我收到以下錯誤:
無法分配給屬性'System.Windows.Controls.TextBox.TextChanged'。
所以它沒有找到事件處理程序。 有沒有一種優雅的方式我可以分配事件處理程序而不必在每個子類中重復它們(~30個孩子和計數)?
這很有趣 - 它似乎是事件機制的限制,只檢查部分代碼隱藏類,而不是它的基類。 ( 這里和這里也提到了這個問題。)我也想不出理想的解決辦法。
當然,您可以通過在每個子類中放置一個虛擬覆蓋來修復錯誤:
protected override void ValidateTextBoxTextChanged(object sender, TextChangedEventArgs e)
{
base.ValidateTextBoxTextChanged(sender, e);
}
現在,這似乎是一個麻煩。 另一種方法是使用觸發器/動作組合來調用基類方法:
<TextBox>
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<ei:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType=local:BaseWindow}}" MethodName="ValidateTextBoxTextChanged" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
為此,您需要將該方法設為公共。 您可以使用上面的變體來簡化語法並減少綁定數量:使用附加屬性來應用觸發器,將驗證方法放在具有可選覆蓋的靜態資源中。
另一種可能的方法是將TextBox
本身子類化,並將驗證邏輯放在那里。 您可以公開依賴項屬性以允許擴展TextBox的實例覆蓋默認驗證邏輯。
我在代碼中使用了這個。 我有一個基本的xaml頁面,幾乎沒有下降
<Page x:Class="mycls"><Button x:Name="mybrn"/></Page>
還有一些繼承它的觀點:
<local:mycls x:Class="mychild"></local:mycls>
如果我在xaml中分配監聽器,它在子視圖中不起作用。 但在代碼隱藏中它起作用:
public mycls()
{
InitializeComponent()
(this.FindName("mybtn") as Button).Click += mybtn_click;
}
在這個子視圖之后“inhherit”也是一個處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.