質問

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()

他のメソッドと同様に、イベントを通じてオブジェクトを渡すこともできます。これにより、ユーザー コントロールがページに何を削除するかを指示できるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top