Выбор ListBoxItem, когда его внутренний ComboBox фокусируется

Существует два возможных решения для Вашей проблемы: централизованный VCS или Распределенный VCS (DVCS).

Централизованный VCS как Подрывная деятельность удовлетворил бы Вас функция фиксации и просмотра журнала. Это также позволяет Вам безопасно сохранить свой репозиторий к другому компьютеру, который должен быть одной из Ваших главных целей, поскольку отказ жесткого диска всегда является возможностью. Однако с помощью Подрывной деятельности история все еще находится только в центральном расположении, делающем его уязвимый, и Вы заявили, что не хотите иметь другой сервер.

Распределенные системы управления версиями (DVCS) такой как Подвижные и Мерзавец позволяют Вам сделать более сложные операции на своем репозитории. С обоими из тех инструментов целый репозиторий находится с тем же компьютером, делающим его, укусил легче сделать резервные копии и использующий репозиторий с другим компьютером, например, ноутбуком. В то время как Подвижный мог бы казаться сложным сначала операции, которые Вы будете использовать с подрывной деятельностью, в значительной степени то же с Подвижным. Поэтому нет никаких дополнительных издержек, чтобы начать, если Вы уже знаете Подрывную деятельность, и можно легко использовать больше расширенных функций Подвижных позже.

необходимо быть в состоянии найти службу репозитория онлайн для Подвижного репозитория, позволяющего Вам сделать легкие резервные копии и сделать сотрудничество однажды, если у Вас есть потребность в нем.

Моя рекомендация Подвижна с TortoiseHg.

12
задан Drew Noakes 22 September 2009 в 13:02
поделиться

2 ответа

Я нашел решение вашей проблемы.

Проблема в том, что когда у вас есть элемент управления в элементе списка, и этот элемент управления щелкают (например, для ввода текста или изменения значения combobox), ListBoxItem не выбирается.

это должно сработать:

public class FocusableListBox : ListBox
{
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return (item is FocusableListBoxItem);
    }

    protected override System.Windows.DependencyObject GetContainerForItemOverride()
    {
        return new FocusableListBoxItem();
    }
}

-> Используйте этот FocusableListBox вместо ListBox по умолчанию WPF.

И используйте этот ListBoxItem:

public class FocusableListBoxItem : ListBoxItem
{
    public FocusableListBoxItem()
    {
        GotFocus += new RoutedEventHandler(FocusableListBoxItem_GotFocus);
    }


    void FocusableListBoxItem_GotFocus(object sender, RoutedEventArgs e)
    {
        object obj = ParentListBox.ItemContainerGenerator.ItemFromContainer(this);
        ParentListBox.SelectedItem = obj;
    }

    private ListBox ParentListBox
    {
        get
        {
            return (ItemsControl.ItemsControlFromItemContainer(this) as ListBox);
        }
    }

}

A Treeview также имеет эту проблему, но это решение не работает для Treeview , потому что SelectedItem из Treeview является только для чтения . Так что, если вы можете помочь мне с Treeview, пожалуйста; -)

9
ответ дан 2 December 2019 в 19:31
поделиться

Понятия не имею, почему ваш триггер не работает. Чтобы поймать событие получения фокуса поля со списком (или любого элемента управления внутри элемента списка), вы можете использовать прикрепленные перенаправленные события. Вы можете поместить код также в производный список, если вам нужно такое поведение в других частях приложения.

XAML:

<Window x:Class="RoutedEventDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Specialized="clr-namespace:System.Collections.Specialized;assembly=System"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    Height="300" Width="300">

    <Window.Resources>

        <DataTemplate x:Key="myDataTemplate">
            <Grid>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}" Margin="5,0"/>
                    <ComboBox Width="50">
                        <ComboBoxItem>AAA</ComboBoxItem>
                        <ComboBoxItem>BBB</ComboBoxItem>
                    </ComboBox>
                </StackPanel>
            </Grid>
        </DataTemplate>

    </Window.Resources>

    <Grid>

        <ListBox ItemTemplate="{StaticResource myDataTemplate}">
            <ListBox.ItemsSource>
                <Specialized:StringCollection>
                    <System:String>Item 1</System:String>
                    <System:String>Item 2</System:String>
                    <System:String>Item 3</System:String> 
                </Specialized:StringCollection>
            </ListBox.ItemsSource>
        </ListBox>

    </Grid>
</Window>

Код, стоящий за подключением ко всем полученным событиям фокуса.

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace RoutedEventDemo
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            EventManager.RegisterClassHandler(typeof(UIElement),
                                              GotFocusEvent,
                                              new RoutedEventHandler(OnGotFocus));
        }

        private static void OnGotFocus(object sender, RoutedEventArgs e)
        {
            // Check if element that got focus is contained by a listboxitem and
            // in that case selected the listboxitem.

            DependencyObject parent = e.OriginalSource as DependencyObject;
            while (parent != null)
            {
                ListBoxItem clickedOnItem = parent as ListBoxItem;
                if (clickedOnItem != null)
                {
                    clickedOnItem.IsSelected = true;
                    return;
                }

                parent = VisualTreeHelper.GetParent(parent);
            }
        }
    }
}
0
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: