ListBox и поиск выбранного флажка - PullRequest
0 голосов
/ 02 августа 2011

Я сейчас работаю над C # wpf проектом. У меня есть список, и я динамически добавляю флажки в список со следующим кодом.

while (reader.Read())
{
     Console.WriteLine("Database: " + reader.GetString("Database"));
     string databaseName = reader.GetString("Database");
     CheckBox chkDatabase = new CheckBox();
     chkDatabase.Content = databaseName.Replace("_", "__");
     chkDatabase.Uid = "chk_" + reader.GetString("Database");
     chkDatabase.Checked += new RoutedEventHandler(chkDatabase_Checked);

     lstDatabase.Items.Add(chkDatabase);
}

Это работает нормально, и я обработчик маршрута отлично работает, чтобы определить, был ли установлен флажок или нет.

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

private void lstDatabase_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Console.WriteLine("Selection Changed");
    ListBox checkbox = (ListBox)e.Source;
    Console.WriteLine("Checkbox2: " + checkbox.SelectedValue);
}

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

Спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 3 ]

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

Чтобы получить сам флажок, мы просто приводим выбранный элемент (который будет флажком, поскольку вы только добавили флажки к элементу списка) в флажок.

CheckBox chkBox = lstDatabase.SelectedItem as CheckBox;

Тогда мы просто получаем значение проверки, используя

chkBox.IsChecked;

Поместите этот код в вашу функцию SelectionChanged, и вы получите значение флажка. Вы также можете установить его там.

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

EDIT:

Однако я бы предложил запустить этот код для другого события. Если пользователь нажимает на уже выбранный элемент, чтобы установить флажок, событие SelectionChanged НЕ будет запускаться. Я бы предложил MouseUp, если вы проверите, что на самом деле существует selectedItem перед запуском кода.

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

Способ решения этой проблемы - переключение на привязку данных.

Создайте класс (назовем его A) (который реализует INotifyPropertyChanged), который представляет отдельный элемент в списке, и добавьте свойство в класс с именем Selected.

Создайте экземпляр ObservableCollection (назовем его col) и добавьте экземпляр A для каждой строки / элемента.

Теперь свяжите ListBox следующим образом:

Первый в коде lstDatabase.DataContext = col;

Затем в XAML:

<ListBox ItemsSource="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

(я не использовал компилятор, чтобы проверить это)

Теперь, если вы хотите узнать, какие предметы выбраны, просто сделайте этот выбор в коллекции:

var selectedItems = col.Where(item => item.IsSelected);
0 голосов
/ 02 августа 2011

Один простой способ сделать это так:

ListBoxItem lbItem = new ListBoxItem();
lbItem.Content = chkDatabase;
lstDatabase.Items.Add(lbItem);

Тогда в вашем обработчике:

bool chkVal = false;
ListBoxItem selItem = lstDatabase.SelectedItem as ListBoxItem;
if (selItem != null && selItem.Content is CheckBox)
    chkVal = ((CheckBox)selItem.Content).IsChecked;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...