Как мне синхронизировать SelectedItem ListBox? - PullRequest
2 голосов
/ 06 ноября 2008

У меня есть этот ListBox, который связан с ObservableCollection. Каждый объект в списке реализует интерфейс с именем ISelectable

public interface ISelectable : INotifyPropertyChanged
{
    event EventHandler IsSelected;
    bool Selected { get; set; }
    string DisplayText { get; }
}

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

ISelectable selectable = (ISelectable)e.AddedItems[0];
selectable.Selected = true;

Моя проблема в том, что когда я выбираю объект с помощью кода, я не могу получить ListBox для изменения выбранного элемента. Я использую DataTemplate, чтобы показать выбранный объект другим цветом, что означает, что все отображается правильно. Но ListBox имеет последний объект, который пользователь щелкнул, как SelectedItem, что означает, что элемент нельзя щелкнуть без предварительного выбора другого объекта в списке.

У кого-нибудь есть идеи, как это решить? Я почти уверен, что смогу достичь того, чего хочу, написав некоторый пользовательский код для обработки событий мыши и клавиатуры, но я, скорее, нет. Я попытался добавить свойство SelectedItem в коллекцию и связать его с SelectItemProperty ListBox, но не повезло.

Ответы [ 3 ]

4 голосов
/ 07 ноября 2008

Вы также можете сделать это, привязав данные ListBoxItem.IsSelected к свойству Selected. Идея состоит в том, чтобы установить привязку для каждого из ListBoxItems по мере их создания. Это можно сделать с помощью стиля, который предназначен для каждого из элементов ListBoxItems, сгенерированных для ListBox.

Таким образом, когда элемент в ListBox выбран / не выбран, соответствующее свойство Selected будет обновлено. Аналогично установка свойства Selected в коде будет отражена в ListBox

Чтобы это работало, свойство Selected должно вызывать событие PropertyChanged.

<List.Resources>
    <Style TargetType="ListBoxItem">
        <Setter 
            Property="IsSelected" 
            Value="{Binding 
                        Path=DataContext.Selected, 
                        RelativeSource={RelativeSource Self}}" 
            />
    </Style>
</List.Resources>
1 голос
/ 06 ноября 2008

Вы смотрели на события списка SelectedItemChanged и SelectedIndexChanged списка?

Они должны запускаться всякий раз, когда изменяется выбор, независимо от того, как он выбран.

0 голосов
/ 06 ноября 2008

Я думаю, вы должны запустить событие propertyChanged, когда выбор изменился. Добавьте этот код к объекту, который реализует ISelectable. Вы получите что-то вроде:

private bool _Selected;
        public bool Selected
        {
            get
            {
                return _Selected;
            }
            set
            {
                if (PropertyChanged != null)                
                    PropertyChanged(this, new PropertyChangedEventArgs("Selected"));

                _Selected = value;
            }
        }

Я попробовал следующий код:

public ObservableCollection<testClass> tests = new ObservableCollection<testClass>();

        public Window1()
        {
            InitializeComponent();
            tests.Add(new testClass("Row 1"));
            tests.Add(new testClass("Row 2"));
            tests.Add(new testClass("Row 3"));
            tests.Add(new testClass("Row 4"));
            tests.Add(new testClass("Row 5"));
            tests.Add(new testClass("Row 6"));
            TheList.ItemsSource = tests;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            tests[3].Selected = true;
            TheList.SelectedItem = tests[3];
        }

, где testClass реализует ISelectable.

Это кусок xaml, ничего особенного:

<ListBox Grid.Row="0" x:Name="TheList"></ListBox>        
<Button Grid.Row="1" Click="Button_Click">Select 4th</Button>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...