#c# #wpf #checkbox
#c# #wpf #флажок
Вопрос:
Я использую шаблоны данных для установки значений флажков в выпадающем списке как таковых:
<ComboBox Margin="118,117,163,164" ItemsSource="{Binding collection}">
<ComboBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Это работает так, как должно. Моя проблема в том, что когда пользователь устанавливает флажок, мне нужно иметь возможность получить значение содержимого, сохраненное в пределах флажка. Возможно ли это?
Спасибо.
Комментарии:
1. Что вы имеете в виду, говоря «получить значение содержимого, хранящееся внутри флажка»?
2. Я предполагаю, что вы имеете в виду, что вам нужны все имена, которые пользователь отметил / выбрал.
3. Текстовое значение для флажка сохраняется как Содержимое.
Ответ №1:
Вам нужно привязать свойство IsChecked флажка к другому свойству объекта поддержки для каждого элемента. т.е. тип, у которого есть имя, должен предоставлять логическое свойство IsSelected.
Привязка к данным соответствующим образом обновит свойство IsSelected, к которому вам будет легко получить доступ в коде. например, вы можете просмотреть список и отфильтровать все элементы, для которых IsSelected = false.
Пример кода
XAML
<StackPanel>
<ComboBox ItemsSource="{Binding Items}">
<ComboBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button Click="EvaluateSelectedItems">Show Selected</Button>
<TextBlock>Selected Items</TextBlock>
<ListBox ItemsSource="{Binding SelectedItems}" DisplayMemberPath="Name" Background="AliceBlue"/>
</StackPanel>
Скрытый код
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
Items = new List<ItemVM>
{
new ItemVM {IsSelected = false, Name = "Firefox"},
new ItemVM {IsSelected = false, Name = "Chrome"},
new ItemVM {IsSelected = false, Name = "IE"}
};
}
public IEnumerable<ItemVM> Items { get; set; }
private IEnumerable<ItemVM> _selectedItems;
public IEnumerable<ItemVM> SelectedItems
{
get { return _selectedItems; }
set
{
_selectedItems = value;
if (PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("SelectedItems"));
}
}
private void EvaluateSelectedItems(object sender, RoutedEventArgs e)
{
SelectedItems = Items.Where(item => item.IsSelected);
}
Комментарии:
1. Не позволяет мне использовать привязку к проверяемому свойству, поскольку в нем говорится, что для этого требуется событие
2. Имя свойства проверено, событие, когда оно выбрано, проверено.
3. @Darren — да, я просто умолчал об этом.. Свойство, которое вы хотите привязать, помечено как логическое свойство на флажке. Обновлено..
4. Как я могу затем использовать это, чтобы получить текст содержимого из флажка? Еще раз спасибо.
5. @Gishu, большое спасибо. Это отлично работает. Есть ли способ оценить выбранные объекты без необходимости использовать кнопку? Единственное событие, отображаемое ObservableCollection, не подходит для этого. Еще раз спасибо.