質問
ListBoxItems にスタイルが定義された ListBox があります。このスタイル内には、いくつかのラベルとボタンがあります。そのボタンの 1 つで、自分のページ (またはそのスタイルを使用する任意のページ) で処理できるクリック イベントを定義したいと考えています。ListBoxItems スタイルからのイベントを処理するイベント ハンドラーを WPF ページに作成するにはどうすればよいですか?
私のスタイルは次のとおりです(影響を受けるコードのみ)。
<Style x:Key="UsersTimeOffList" TargetType="{x:Type ListBoxItem}">
...
<Grid>
<Button x:Name="btnRemove" Content="Remove" Margin="0,10,40,0" Click="btnRemove_Click" />
</Grid>
</Style>
ありがとう!
解決
を見てみましょう ルーテッドコマンドs.
myclass のどこかに次のようにコマンドを定義します。
public static readonly RoutedCommand Login = new RoutedCommand();
次に、次のコマンドを使用してボタンを定義します。
<Button Command="{x:Static myclass.Login}" />
追加情報については、CommandParameter を使用できます。
最後になりましたが、コマンドを聞き始めてください。
いくつかの優れた処理を実行したいクラスのコンストラクターに、次のものを配置します。
CommandBindings.Add(new CommandBinding(myclass.Login, ExecuteLogin));
または XAML で:
<UserControl.CommandBindings>
<CommandBinding Command="{x:Static myclass.Login}" Executed="ExecuteLogin" />
</UserControl.CommandBindings>
そして、CommandBinding に必要なデリゲートを実装します。
private void ExecuteLogin(object sender, ExecutedRoutedEventArgs e)
{
//Your code goes here... e has your parameter!
}
ビジュアル ツリーのどこからでもこのコマンドを聞くことができます。
お役に立てれば
PS CanExecute デリゲートを使用して CommandBinding を定義することもできます。これにより、CanExecute がそうする場合はコマンドを無効にすることもできます:)
PPS 別の例を次に示します。 WPF の RoutedCommand
他のヒント
Arcturus が投稿したように、RoutedCommands はこれを実現する優れた方法です。ただし、DataTemplate にボタンが 1 つしかない場合は、これはもう少し簡単になる可能性があります。
実際には、次のように、ホスト ListBox から任意のボタンの Click イベントを処理できます。
<ListBox Button.Click="removeButtonClick" ... />
ListBox 内に含まれるボタンは、クリックされるとそのイベントを発生させます。イベント ハンドラー内から e.OriginalSource を使用して、クリックされたボタンへの参照を取得できます。
ListBoxItem に複数のボタンがある場合、これは明らかに単純すぎますが、多くの場合は問題なく機能します。
リストボックスを収容するユーザー コントロール (.ascx) を作成できます。次に、ページに公開イベントを追加します。
Public Event btnRemove()
次に、ユーザーコントロールのボタンクリックイベントで
RaiseEvent btnRemove()
他のメソッドと同様に、イベントを通じてオブジェクトを渡すこともできます。これにより、ユーザー コントロールがページに何を削除するかを指示できるようになります。