Окно списка в стиле кнопки не работает - PullRequest
2 голосов
/ 02 августа 2011

У меня есть 2 списка в моем приложении, которые используют

<Window.Resources>
    <ItemsPanelTemplate x:Key="WrapPanelTemplate">
        <WrapPanel Width="290"/>
    </ItemsPanelTemplate>
    <DataTemplate x:Key="ButtonItemTemplate">
        <Button Content="{Binding Path=Name}" Width="120" Margin="3,2,3,2" />
    </DataTemplate>
</Window.Resources>

Все выглядит отлично, но когда я пытаюсь нажать на них, они не выбирают новый элемент. У меня есть SelectedItem, связанный со свойством на моей модели представления, но всякий раз, когда я выбираю новый элемент, метод set не происходит. У меня есть обычный список, который подключен таким же образом и работает. Вот реализация пользовательского списка:

<ListBox Height="284" HorizontalAlignment="Left" x:Name="faveProgramsButtons" 
    ItemsSource="{Binding Path=FavoriteAppList}" 
    SelectedItem="{Binding Path=FavoriteAppList_SelectedApp}" VerticalAlignment="Top" 
    Width="281" ItemsPanel="{StaticResource WrapPanelTemplate}"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    ItemTemplate="{StaticResource ButtonItemTemplate}">
</ListBox>

Спасибо!

1 Ответ

3 голосов
/ 02 августа 2011

Проблема в том, что Button глотает щелчок мыши, поэтому ListBoxItem в ListBox никогда не получает его, следовательно, он никогда не выбирается. Если вы хотите иметь возможность выбирать элементы при нажатии Button, вы можете попробовать использовать вместо него ToggleButton и связать IsChecked с IsSelected

<DataTemplate x:Key="ButtonItemTemplate">
    <ToggleButton Content="{Binding Path=Name}" Width="120" Margin="3,2,3,2" 
                  IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}},
                                      Path=IsSelected,
                                      Mode=TwoWay}"/>
</DataTemplate>

Вы также можете достичь этого с помощью небольшого кода или прикрепленного поведения.

ButtonItemTemplate

<DataTemplate x:Key="ButtonItemTemplate">
    <Button Content="{Binding Path=Name}" Width="120" Margin="3,2,3,2"
            Click="TemplateButton_Click"/>
</DataTemplate>

Код позади

private void TemplateButton_Click(object sender, RoutedEventArgs e)
{
    Button clickedButton = sender as Button;
    ListBoxItem listBoxItem = GetVisualParent<ListBoxItem>(clickedButton);
    if (listBoxItem != null)
    {
        listBoxItem.IsSelected = true;
    }
}

public static T GetVisualParent<T>(object childObject) where T : Visual
{
    DependencyObject child = childObject as DependencyObject;
    // iteratively traverse the visual tree
    while ((child != null) && !(child is T))
    {
        child = VisualTreeHelper.GetParent(child);
    }
    return child as T;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...