2011-10-26 6 views
3

私の質問はこれに非常に似ている:(Binding events to buttons in an ItemsControl)しかし、私はそこに解決策を見つけていませんでした。 私はItemsControlにを持っており、そのDataTemplateの内部で、私は別のItemsControlを持っています。外部コントロールのアイテムには、いくつかのプロパティを持つクラスが含まれ、プロパティの1つはコレクションです。インナーのItemsControlソースは、このコレクションにバインドされ、内部統制の内側にボタンがあるのDataTemplateされます。バインディング/配線イベント

私の問題は、ボタン(.. Click = "dummyfunc")のイベントを配線して、プロジェクトを実行しようとすると、未処理のXamlParseException(4004)が発生し、 "プロパティに割り当てられませんでした「System.Windows.Controls.Primitives.ButtonBase.Click」」 私は外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)トリガー:

ことの一つは、動作します。

sender as HyperinkButton 

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

(私は例のイベントを発射したボタンを取得することができます:

は、しかし、これに代えて、私は通常の方法で、内部コントロールでイベントを処理する必要があります

または

e.OriginalSource as HyperlinkButton 

私はこの問題は、イベントがバブルアップと私は除いて解析を取得していないことであると仮定なぜなら、パーサは実際のスコープ内でイベントハンドラ宣言を見つけることができないからです。内側のコントロールのCodeBehindではありません。(

私はこれを必要とするのは、コードでカスタムUIロジックを行いたいからですこの後にのみ、DeleteMeロジックを何とかトリガーします。

おかげで、 バリント

答えて

3

それはCallMethodActionための質素文書から明らかではないが、MethodNameプロパティで指定された方法は、これらの署名のいずれかを持つことができます。

  • void Method()
  • void Method(object associatedObject, object parameter)
  • をさらに

、デフォルトのアクションのは、通常、イベントハンドラに2番目の引数として渡されるイベント引数の値です。これは、あなたがClickイベントを処理するときに、あなたが望むすべての情報にアクセスすることができます

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

Clickイベントでは、パラメータの種類はRoutedEventArgsは、あなたがこのようなあなたのDeleteMeメソッドを定義することができます。

+0

TargetObjectを定義せずにclickイベントをトリガする方法はありますか?私はオブジェクト内ではなく、ネストされたItemsControlsを含むページのCodeBehind内でイベントを処理したいと思います。なぜなら、UIロジックは、データを保持するオブジェクトではなくページのCodeBehindで行うべきだと思うからです。 –

+0

あなたは 'TargetObject =' {Binding ElementName = mainPage} ''のように 'TargetObject'を自由に設定することができます。 –

+0

ああ、ありがとう、今は魅力のように動作します! :) (btwはそのバブルアップのことでしたか?つまり、内部のitemscontrolのボタンに単に書き込んだときに何が問題になったのでしょうか:Click = "dummyfunc"?) –

関連する問題