2011-12-15 106 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. 離開所有啓用的編輯按鈕,當用戶點擊一個,那麼它所屬的行就變成了列表框的SelectedItem,確保當按鈕被點擊時,預期的人物項目作爲CommandParameter被傳遞
  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> 

我談論的部分是在Button.Style,我會嘗試,如果(到它所屬的ListBoxItem中)選擇它的祖先來檢查,如果是這樣,然後啓用按鈕。但是,該項目被選中時,該按鈕未被啓用。

回答

1

也許最簡單的方法是在你PersonViewModel到implment一個IsSelected財產和綁定,爲您的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 2011-12-17 12:50:53

相關問題