WPF получает содержимое флажка

#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, не подходит для этого. Еще раз спасибо.