2011-12-15 11 views
2

MVVM Lightを使用していて、リストボックスの各行に「編集」ボタンと名前が表示されるようにデータテンプレートを持つリストボックスがあります。ListBoxのボタンをアイテムが選択されている場合にのみ有効にする

EventToCommandRelayCommandオブジェクトを使用して、ボタンをViewModelに接続することができます。

リストボックス内の項目がボタン上のデータトリガーで選択されるまで、ボタンコントロールを無効にすることもできます。ここにxamlがあります:

<DataTrigger 
    Binding="{Binding ElementName=lbPlayersList, Path=SelectedItem}" 
    Value="{x:Null}"> 
    <Setter Property="Button.IsEnabled" Value="False"/> 
</DataTrigger> 

ここは私の問題です。項目が選択されると、すべてのボタンが有効になります。リスト内の項目1を選択すると、すべてのボタンが有効になります。つまり、項目1が選択されているときに項目2のボタンをクリックすると、項目1の人物がCommandParameterとして渡されます。私が知りたいのですがどのような項目2.

上の人は、次のいずれかを実行する方法がある場合は次のとおりです。

  1. が有効になって編集ボタンのすべてを残し、およびユーザーが1つをクリックすると、ボタンがクリックされたときに期待される人物アイテムがCommandParameterとして渡されるように、リストボックスのSelectedItemになります。
  2. すべての[編集]ボタンを無効にし、wリストボックス内の人が選択されると、リストボックスのその行の編集ボタンだけが再び有効になり、目的のユーザーがコマンドのCommandParameterとして渡されます。

おかげで、 スティーブ

UPDATE:このような何かについて何(それが動作していないですが、私はおそらく何か間違ったことをやっています)。

<DataTemplate x:Key="PlayersListTemplate"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="auto"/> 
      <ColumnDefinition Width="auto"/> 
     </Grid.ColumnDefinitions> 
     <Button Grid.Column="0" IsEnabled="False" Content="Edit" Margin="4,4,8,4" Height="25" Width="25" FontSize="10" VerticalAlignment="Center"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Click"> 
        <GalaSoft_MvvmLight_Command:EventToCommand x:Name="EditButtonClick" 
                   Command="{Binding Source={StaticResource Locator}, Path=Main.TestCommand}" 
                   CommandParameter="{Binding ElementName=lbPlayersList, Path=SelectedItem}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
      <Button.Style> 
       <Style> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True"> 
          <Setter Property="Button.IsEnabled" Value="True"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button> 
     <StackPanel Grid.Column="1" VerticalAlignment="Center"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="auto"/> 
        <RowDefinition Height="auto"/> 
       </Grid.RowDefinitions> 
       <StackPanel Orientation="Horizontal" Grid.Row="0"> 
        <TextBlock Text="{Binding LastName}" FontSize="16" FontWeight="DemiBold" /> 
        <TextBlock Text=", " FontSize="16" FontWeight="DemiBold" VerticalAlignment="Center"/> 
        <TextBlock Text="{Binding FirstName}" FontSize="16" FontWeight="DemiBold" VerticalAlignment="Center"/> 
       </StackPanel> 
       <TextBlock Text="{Binding NickName}" Grid.Row="1" FontSize="10" /> 
      </Grid> 
     </StackPanel> 
    </Grid> 
</DataTemplate> 

私が話しています部分は、私はその祖先が(それが属するlistboxitemがする)選択されているかどうかをチェックしてみてください、もしそうであれば、そのボタンを可能にするButton.Styleです。ただし、アイテムが選択されているとき、ボタンは有効になっていません。

答えて

1

おそらく最も簡単な方法は、あなたPersonViewModelIsSelectedプロパティをimplmentと双方向バインディングを使用してListBoxItemIsSelectedにそれをバインドすることです。今すぐあなたのコマンドに人をCommandParameterCommandParameter="{Binding}")で渡すことができます。このインフラストラクチャは、あなたが今、あなたのコマンドのCanExecuteメソッドを使用することができる場所になったら

- CommandParamter入力として受け入れる - 人が選択されていると、あなたのコマンドは、それゆえ、あなたの「願いに(ポイント2のためのソリューションを有効にする必要があるかどうかを判断しますリスト')。ポイント1の場合

あなたの「ウィッシュリスト」に実装がさらに簡単です:

バインディング
new RelayCommand(
    (p) => { /* execution method, p holds the command parameter */ } 
    (p) => { /* can execute method, p holds the command parameter */ } 
); 

<Button Content="Edit" 
     Command="{Binding DataContext.EditCommand, RelativeSource={RelativeSource AncestorType=ListBox}}" 
     CommandParameter="{Binding}" 
+0

UPDATE:何がこのようなものについては(それが動作していないですが、私はをおそらくちょうど何か間違っている)。 私の更新された記事の上のコードを参照してください。 – Haacker

関連する問題