2011-10-26 30 views
3

我的問題與此非常相似:(Binding events to buttons in an ItemsControl),但我沒有在其中找到解決方案。 我有一個ItemsControl和它的DataTemplate,我有另一個ItemsControl。外部控件中的項目包含具有某些屬性的類,其中一個屬性是一個集合。內部ItemsControl源綁定到此集合,並且在內部控件DataTemplate內部有一個Button。在ItemsControls DataTemplate中嵌套的ItemsControl中的按鈕綁定/接線事件

我的問題是,當我連接按鈕的事件(.. Click =「dummyfunc」)並嘗試運行該項目時,我得到一個未處理的XamlParseException(4004),並說「無法分配給屬性'System.Windows.Controls.Primitives.ButtonBase.Click'「 我在頁面的CodeBehind中聲明瞭我的事件處理程序,其中外部ItemsControl放置在Xaml中。對於放置在外部控件DataTemplate中的按鈕,它工作正常。但在內部控件模板中,我無法連線任何事件。

一兩件事的工作:

<HyperlinkButton Content="x"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
      <ei:CallMethodAction MethodName="DeleteMe" TargetObject="{Binding}"/>        
     </i:EventTrigger> 
    </i:Interaction.Triggers>    
</HyperlinkButton> 

但這僅觸發了方法(DELETEME),這是在我上面提到的項目,有一些屬性和集合來實現。

但不是這個,我需要處理在內部控制中的事件與通常的方法:

public void dummyfunc(object sender, RoutedEventArgs e){...} 

(這樣我就可以得到解僱例如該事件的按鈕:

sender as HyperinkButton 

e.OriginalSource as HyperlinkButton 

我想的問題是,該事件不會冒泡,我得到了解析除因爲解析器無法在實際範圍內找到事件處理程序聲明,這顯然不是內部控制的CodeBehind:(

我需要這個的原因是因爲我想在代碼中執行一些自定義UI邏輯,並在此之後以某種方式觸發DeleteMe邏輯。

感謝, 巴林特

回答

3

這是從CallMethodAction斯巴達文檔並不明顯,而是由MethodName屬性命名的方法可以有這些特徵的:

  • void Method()
  • void Method(object associatedObject, object parameter)

此外,默認的parameterEventTrigger action是通常作爲事件處理程序的第二個參數傳遞的事件參數值。對於Click事件,參數的類型爲RoutedEventArgs,所以你可以定義你DeleteMe方法是這樣的:

public void DeleteMe(object sender, RoutedEventArgs e) 
{ 
    Debug.WriteLine("sender: {0}", sender); 
    Debug.WriteLine("e.OriginalSource: {0}", e.OriginalSource); 
} 

這使您可以訪問所有你處理Click事件時想要的信息。

+0

如何在不定義TargetObject的情況下觸發點擊事件?我想處理不在對象中的事件,而是在包含嵌套ItemsControls的頁面的CodeBehind中,因爲我認爲UI邏輯應該在頁面的CodeBehind中完成,而不是在僅保存數據的對象中完成。 –

+0

您可以根據需要設置'TargetObject',例如'TargetObject =「{Binding ElementName = mainPage}」'。 –

+0

非常感謝你,現在它就像一個魅力! :) (順便說一句,我對這個泡沫的東西是正確的?或者你認爲什麼導致了這個問題,當我只是寫了內部itemscontrol按鈕:Click =「dummyfunc」?) –

相關問題