Как выделить элемент списка на событии щелчка правой кнопкой мыши? - PullRequest
0 голосов
/ 04 октября 2010

Я не знаю, первый ли я задал этот вопрос (я обыскал всю доску), но я так и не нашел ответов. Как сказано в заголовке, я пытаюсь выделить / выбрать элемент в списке, когда щелкаю по нему правой кнопкой мыши.

Вот код XAML:

<ListBox Grid.Row="1" x:Name="ContactList" Margin="6" ItemsSource="{Binding ''}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Status_Image}" Margin="0,0,3,0" />
                <StackPanel Orientation="Vertical">
                    <TextBlock Height="20" HorizontalAlignment="Left" Text="{Binding Name}" FontWeight="Bold" FontSize="13" Foreground="Black" />
                    <TextBlock Height="20" HorizontalAlignment="Left" Text="{Binding Message}" FontSize="11" Foreground="Gray" />
                </StackPanel>
    <Image Source="{Binding NotifImg}" Margin="8,0,0,0"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Я знаю, как обрабатывать щелчок правой кнопкой мыши и отображать контекстное меню для кнопки или отдельного элемента, но не для связанного списка. Если у вас есть какие-либо советы о том, как мне поступить, пожалуйста, не стесняйтесь сказать мне, потому что я в настоящее время застрял.

Спасибо, Еписмен.

Ответы [ 2 ]

1 голос
/ 06 октября 2010

Хорошо, я нашел очень простой и чистый способ достижения того, что я хотел сделать!

Вот код XAML:

<ListBox Grid.Row="1" x:Name="ContactList"ItemsSource="{Binding ''}" MouseRightButtonDown="ContactList_MouseRightButtonDown" MouseRightButtonUp="ContactList_MouseRightButtonUp">
     <ListBox.ItemTemplate>
         <DataTemplate>
             <StackPanel Orientation="Horizontal" >
                 <TextBlock Height="20" HorizontalAlignment="Left" Text="{Binding Name}" FontWeight="Bold" FontSize="13" Foreground="Black" />
                 <TextBlock Height="20" HorizontalAlignment="Left" Text="{Binding Message}" FontSize="11" Foreground="Gray" />
                 <Image Source="{Binding NotifImg}" Margin="8,0,0,0"/>
             </StackPanel>
         </DataTemplate>
     </ListBox.ItemTemplate>
</ListBox>

И код позади:

    private void ContactList_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        e.Handled = true;
    }

    private void ContactList_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), (sender as ListBox)).OfType<ListBoxItem>().First().IsSelected = true;
    }    

Не забудьте включить System.Linq для OfType.

Ephismen.

0 голосов
/ 01 октября 2013

Решение для режима множественного выбора

Решение от Ephismen выше не работает корректно для ListBox в режиме множественного выбора (например, оно не переключает выбранное состояние элемента при нажатии Ctrl, не отменяет выбор других элементов, когда Ctrl не выключен, ...).

Я бы предложил вместо этого создать собственный ListBoxItem с пользовательским обработчиком щелчка правой кнопкой мыши. Там вы можете смоделировать щелчок левой кнопкой мыши и, таким образом, получить точно такое же поведение:

public class CustomListBoxItem : ListBoxItem
{
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e)
    {
        OnMouseLeftButtonDown(e);
    }
}

Вам также может понадобиться создать простой конвертер для привязки ItemsSource - вместо стандартного ListBoxItem, который будет создан по умолчанию, вашим CustomListBoxItem:

public class ItemsToCustomListBoxItemsConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;

        return
            from object item in (IEnumerable) value
            select new CustomListBoxItem
                {
                    Content = item
                };
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new InvalidOperationException();
    }
}

А вот как будет выглядеть привязка ItemsSource:

<ListBox
    ...
    ItemsSource="{Binding Converter={StaticResource ItemsToCustomListBoxItemsConverter}}"
    ...>
...