Захват флажка списка WPF Listbox - PullRequest
0 голосов
/ 14 мая 2010

Пытался выяснить, как мне захватить события из списка. В шаблоне я добавил параметр IsChecked = "", который запускает мой метод. Тем не менее, проблема заключается в попытке захватить то, что было проверено в методе. SelectedItem возвращает только то, что выбрано в данный момент, а не флажок.

object selected = thelistbox.SelectedItem;
DataRow row = ((DataRowView)selected).Row;
string teststring = row.ItemArray[0].ToString();    // Doesn't return the checkbox!

<ListBox IsSynchronizedWithCurrentItem="True" Name="thelistbox" ItemsSource="{Binding mybinding}">
    <ListBox.ItemTemplate>
            <DataTemplate>
                    <StackPanel>
                            <CheckBox Content="{Binding personname}" Checked="CheckBox_Checked" Name="thecheckbox"/>
                        </StackPanel>
                </DataTemplate>
        </ListBox.ItemTemplate>
</ListBox>

1 Ответ

1 голос
/ 14 мая 2010

В идеале вы должны привязать IsChecked к свойству в строке, т.е.

<CheckBox Content="{Binding personname}" IsChecked="{Binding IsPersonChecked}" Name="thecheckbox"/>

где «IsPersonChecked» - это столбец в вашей таблице данных (или то, к чему вы привязываете), точно так же как «имя пользователя» Затем вы можете прочитать, проверяется ли он непосредственно из вашей переменной DataRow:

DataRow row = ((DataRowView)thelistbox.SelectedValue).Row;
bool isPersonChecked = (bool) row["IsPersonChecked"];

Если DataSet напечатан, вы, очевидно, хотите использовать типизированные свойства DataRow.

Обратите внимание, что я использовал SelectedValue, а не свойство SelectedItem. Я считаю, что SelectedItem на самом деле является экземпляром ListBoxItem. Который вы можете использовать, если хотите оставить свой IsChecked свободным. Тогда вам придется получить CheckBox с учетом полной иерархии шаблонов. Что-то вроде:

bool isChecked = ((CheckBox)((StackPanel) ((ListBoxItem) thelistbox.SelectedItem).Content).Children[0]).IsChecked ?? false;

Грязный. (Отладка и настройка иерархии в соответствии с тем, что вы на самом деле получите. Мой код, вероятно, не будет работать как есть.)

Лучше всего использовать RoutedEventArgs вашего обработчика CheckBox_Checked:

private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    CheckBox checkBox = (CheckBox) e.Source;
    DataRow row = ((DataRowView) checkBox.DataContext).Row;
    bool isChecked = checkBox.IsChecked ?? false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...