我正在使用MVVM Light,並且我有一個帶有數據模板的列表框,以便列表框的每一行都顯示一個「編輯」按鈕和一個名稱。只有在選擇其項目時啓用ListBox中的按鈕
我能夠通過EventToCommand
和RelayCommand
對象將按鈕連接到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
我想知道的是,如果有一種方法可以做到以下任一操作:
- 離開所有啓用的編輯按鈕,當用戶點擊一個,那麼它所屬的行就變成了列表框的SelectedItem,確保當按鈕被點擊時,預期的人物項目作爲CommandParameter被傳遞
- 禁用所有的編輯按鈕,並且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中)選擇它的祖先來檢查,如果是這樣,然後啓用按鈕。但是,該項目被選中時,該按鈕未被啓用。
UPDATE:那是這樣的(它不工作,但我可能只是做錯了什麼)。 在我更新的帖子中查看上面的代碼。 – Haacker 2011-12-17 12:50:53