Как получить установленный флажок в приложении Windows Phone?

Я разрабатываю приложение для Windows-приложений. В приложении я хочу поставить несколько флажков. Я могу установить несколько флажков. Но когда я установил флажок, я хочу получить его содержимое (содержимое флажка). Для этого я использую check событие, а также событие click, но я не могу получить результат, как я хочу. Мой код xaml выглядит следующим образом:

          

Пожалуйста, помогите мне …

Я думаю, что вы используете Checkbox не правильно в соответствии с его назначением.

Checkbox должен представлять состояние (например, да / нет) в отношении объекта. Тем не менее, вам просто нужно использовать событие « Checked когда флажок установлен, а « Unchecked противном случае.

Поэтому в событии Checked получите контент, который вы хотите.

редактировать

Вы должны поддерживать это с помощью шаблона MVVM. Для этого в Интернете есть много примеров, я уверен, что вы справитесь с этим.

Вместо того, чтобы Click="CheckBox_Click" , используйте событие « Check :

 private void CheckBox_Checked (Object sender, EventArgs e) { var currentCheckBoxItem = sender as CheckBox; if (currentCheckBoxItem.IsChecked == true) { //you manipulation here... } } 

Еще. это может просто не работать, потому что вы не предоставили достаточно подробностей о своем вопросе.

Редактировать 2 Немного MVVM …

Во-первых, создайте class модели Hobby с единственным строковым свойством (позже вы можете изменить свое мнение, чтобы добавить дополнительные свойства, Idk):

 public class Hobby : INotifyPropertyChanged { private string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } } private bool _isSelected; public bool IsSelected { get { return _isSelected; } set { _isSelected = value; OnPropertyChanged(); } } //You can add some multiple properties here (***) public Hobby (string hobbyName, bool isSelected) { Name = hobbyName; IsSelected = isSelected; } //INotifiyPropertyChanged interface member implementation ... } 

( * ) Например, короткое описание, а затем привяжите его в представлении. Основным преимуществом этого шаблона MVVM является логическое разделение, поэтому, если что-то должно измениться, разделение каждого компонента упрощает его.

Во-вторых, создайте class ViewModel (вы должны реализовать интерфейс INotifyPropertyChanged):

 public class HobbiesViewModel : INotifyPropertyChanged { private ObservableCollection _hobbies; public ObservableCollection HobbiesCollection { get { return _hobbies; } set { _hobbies = value; OnPropertyChanged(); } } //Constructor public HobbiesViewModel { HobbiesCollection = new ObservableCollection(); } //INotifyPropertyChanged interface member implementation ... } 

В-третьих, создайте экземпляр ViewModel (ObservableCollection). Используйте эту быструю помощь: в App.xaml.cs создайте статический объект и используйте его в приложении по мере необходимости:

 public partial class App { //This already exists in your app's code, but I've written it to //make an idea where to write the Hobbies object public static PhoneApplicationFrame RootFrame { get; private set; } public static HobbiesViewModel Hobbies; //Again, the already existing constructor public App() { ... Hobbies = new HobbiesViewModel(); } 

Теперь вы почти все это установили; У вас есть модель, у вас есть ViewModel, все, что осталось, – это создать соединение с представлением. Это можно легко сделать с помощью привязки. ViewModel представляет DataContext вашего элемента управления (в вашем случае LongListSelector , поэтому в конструкторе View (Page)) напишите следующий оператор:

 yourListControlName.DataContext = App.Hobbies; 

Теперь привязка – единственное, что осталось. Это делается в коде XAML. Я не буду класть здесь целый fragment кода XAML, потому что вы знаете, как выглядит ваш элемент управления. Тем не менее, судя по краткой выборке, которую вы предоставили, есть только несколько настроек:

Источник элементов списка управления XAML будет связан с именем объекта ObservableCollection ViewModel представляющим DataContext элемента управления. Немного нечеткое, да? Чтобы быть более ясным, в этом случае вам нужно написать ItemsSource="{Binding HobbiesCollection}" , ObservableCollection . Кроме того, в шаблоне у вас должен быть этот CheckBox связанный с вашими свойствами Model :

   //StackPanel is kinda useless if you have //only one child control in it. But I wrote //according to your code.    

Теперь, для меня это немного непонятно. Зачем использовать флажок? Я подумал о следующем возможном сценарии: вы приходите с некоторой цепочкой ваших увлечений через десериализацию Json Data. Чтобы добавить их в ViewModel , вам нужно:

 App.Hobbies.HobbiesCollection.Add(new Hobby("firstHobbyFromJson", true)); App.Hobbies.HobbiesCollection.Add(new Hobby("secondHobbyFromJson", true)); 

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

 App.Hobbies.HobbiesCollection.Add(new Hobby("aNewHobby", false)); App.Hobbies.HobbiesCollection.Add(new Hobby("anotherNewHobby", false)); 

На данный момент у пользователя есть все свои предыдущие увлечения в списке, а также некоторые новые увлечения, которые вы ему предоставили. После его выбора, если вам нужно сериализовать Json только с выбранными хобби, вы можете сделать следующее:

 var userHobbies = App.Hobbies.HobbiesCollection.Where(h => h.IsSelected); 

или с помощью foreach и получить только те объекты хобби, у IsSelected свойство IsSelected true .

Удачи!

Я нашел решение Simpler.

Моя модель

Вам нужно использовать две переменные, иначе вы можете получить “stackoverflowexception”

  public class ModelObj { public int position { set; get; } public bool isChecked { get { return IsChecked; } set { IsChecked = value; } } public bool IsChecked; } 

Код для добавления в xaml:

  1. isChecked в xaml устанавливает флажок ListView

  2. Mode = TwoWay обновляет логическое значение isChecked classа модели

      

c # Код, обрабатывающий событие

  private void checkBox_Checked(object sender, RoutedEventArgs e) { foreach (ModelObj obj in listItem) { if (obj.isChecked == true) { int selectedPosition = obj.position; } } }