Включение кнопки в ListBox только при выборе ее элемента - PullRequest
2 голосов
/ 15 декабря 2011

Я использую MVVM Light, и у меня есть список с шаблоном данных, так что в каждой строке списка отображается кнопка «Изменить» и имя.

Я могу подключить кнопку кViewModel с EventToCommand и RelayCommand объектом.

Я также могу отключить управление кнопкой, пока элемент в списке не будет выбран с триггером данных на кнопке.Вот этот xaml:

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

Вот моя проблема.Когда элемент выбран, все кнопки включены.поэтому, если вы выбираете элемент 1 в списке, все кнопки включены, что означает, что вы можете затем нажать кнопку на элементе 2, когда элемент 1 выбран, и тогда человек в элементе 1 передается как CommandParameter вместочеловек по пункту 2.

Я хотел бы знать, есть ли способ выполнить одно из следующих действий:

  1. оставить ВСЕ кнопки «Правка» включенными, и когдапользователь щелкает один, затем строка, которой он принадлежит, становится SelectedItem списка, гарантируя, что элемент ожидаемого человека передается в качестве CommandParameter при нажатии кнопки
  2. , отключает все кнопки редактирования, и когдачеловек в списке выбран, только кнопка редактирования для этой строки списка включена, снова, гарантируя, что желаемый пользователь передан в качестве CommandParameter для команды.

Спасибо, Стив

ОБНОВЛЕНИЕ: Как насчет этого (это не работает, но я, вероятно, просто делаю что-то не так).

<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 Ответ

1 голос
/ 16 декабря 2011

Возможно, самый простой способ - внедрить в вас IsSelected свойство PersonViewModel и связать его с IsSelected вашего ListBoxItem с помощью двусторонней привязки. Теперь вы можете передать человека вашей команде через CommandParameter (CommandParameter="{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}"
...