2017-11-28 13 views
-1

私はCommandingを学びたいと思っていますし、カスタムコマンドを使うための簡単なwpfプロジェクトをセットアップしました。私はListBoxとボタンをウィンドウ上に持っています。リストボックスにフォーカスがあり、アイテムが選択されているときは、ボタンを有効にします。有効にするには、無効にする必要があります。コマンドを使用してListBoxに反応する方法

私は別のCustomCommandsクラスでCustomCommandを定義します。

Public Shared ReceivedFocus As New RoutedCommand 

と、次のように私のウィンドウで、私はそれを設定:

<CommandBinding 
    Command="{x:Static local:CustomCommands.ReceivedFocus}" 
    CanExecute="CanActivate" 
    Executed="ChangeSelection"> 
</CommandBinding> 

と、次のようにListBoxのためのコマンドを使用します。

<ListBox 
    x:Name="lstInactive"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger 
      EventName="GotFocus"> 
      <i:InvokeCommandAction 
       Command="{x:Static local:CustomCommands.ReceivedFocus}" 
      </i:InvokeCommandAction> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ListBox> 

そして最後に、CanActivateルーチンは、

です。
Private Sub CanActivate(sender As Object, e As CanExecuteRoutedEventArgs) 
     If lstInactive.SelectedIndex >= 0 Then 
      e.CanExecute = True 
     Else 
      e.CanExecute = False 
     End If 
End Sub 

これは機能しません。大きな問題は、CanExecute値をButtonに関連付ける方法がわかりません。 CanActivateルーチンのCanExecute値を無視して、代わりにButtonのEnabledプロパティを設定するだけですか?その場合、CanExecuteRoutedEventArgsのCanExecuteパラメータの値は何ですか?

2番目の問題は、ListBoxで項目を2回選択するまで、GotFocusイベントが発生しないことです。

私は指揮を全く理解していないかもしれませんが、これは正しいアプローチではありません。この小さなプロジェクト自体は重要ではありません。実際のプロジェクトでコマンドを使い始める前に、Commandingについて多くの記事を読んだ後でCommandingを理解することを目的としています。残念ながら、この段階では私は明らかではありません。

+0

あなたは 'Button'は、コマンドの状態を表現したい場合は、あなたが実際にそのコマンドに' Button.Command'プロパティをバインドする必要があります。静的参照と 'CommandBinding'を使うのではなく、ビューモデルでコマンドを作成することをお勧めします。そうすることで、論理から表現を分離する明確な概念が得られます。 'ListBox.SelectedItem'をビューモデルのプロパティにバインドし、ビューモデルでコマンドが実行可能かどうかを判断します。 – dymanoid

+0

投票の基本は何ですか? – SezMe

答えて

0

これは機能しません。大きな問題は、CanExecute値をButtonに関連付ける方法がわかりません。同じコマンドへのCommandプロパティのバインド

<Button Content="Button" Command="{x:Static local:CustomCommands.ReceivedFocus}" /> 

Buttonは、あなたがあなたのCanActivateイベントハンドラでのCanExecuteプロパティを設定した値に基づいて有効または無効にする必要があります。

あなたはおそらくSelectionChangedイベントを聴きたがります。これは期待通りに動作します:

<StackPanel> 
    <StackPanel.CommandBindings> 
     <CommandBinding 
       Command="{x:Static local:CustomCommands.ReceivedFocus}" 
       CanExecute="CanActivate" 
       Executed="ChangeSelection"> 
     </CommandBinding> 
    </StackPanel.CommandBindings> 

    <ListBox x:Name="lstInactive"> 
     <ListBoxItem>first</ListBoxItem> 
     <ListBoxItem>second</ListBoxItem> 
     <ListBoxItem>third</ListBoxItem> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <i:InvokeCommandAction Command="{x:Static local:CustomCommands.ReceivedFocus}"> 
       </i:InvokeCommandAction> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </ListBox> 

    <Button Content="Button" Command="{x:Static local:CustomCommands.ReceivedFocus}" /> 
</StackPanel> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void CanActivate(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = lstInactive.SelectedIndex >= 0; 
    } 

    private void ChangeSelection(object sender, ExecutedRoutedEventArgs e) 
    { 

    } 
} 
+0

@mmこれは、リストボックス内の項目を選択するのと同じコマンドをButtonが実行するため、機能しません。私のアプリでは、実行されるべき唯一のアクションは、ウィンドウ上のいくつかのボタンのe.CanExecuteを設定することです。 – SezMe

+0

私はあなたの答えから助けを得て、それに応じて自分のコードを変更しました。ボタンのコマンドを別のルーチンに設定し、ListBox GotFocusとSelectionの変更コマンドを設定してe.CanExecute = Trueに設定しました。しかし、何らかの理由でこれはIsEnabledボタンのプロパティをTrueに変更していません。それが助けになるのであれば、変更されたコードを投稿することができます。 – SezMe

+0

私はListBoxのSelectionChangedイベントを「監視」する必要があることを知りました。私は完全に無能ではないことをあなたに伝えたいだけでした。それだけでそのように見えます。 – SezMe

関連する問題