如何获取Windows Phone应用程序中的复选框内容?
我正在开发Windows手机应用程序。在应用程序中,我想放多个复选框。我可以放多个复选框。但当我选中复选框时,我想获取其内容(复选框内容)。为此我使用检查事件,也点击事件,但我不能得到我想要的结果。我的xaml代码如下:
请帮我 …
我认为您根据其目的不正确使用Checkbox
。
Checkbox
应表示关于主题的状态(例如,是/否)。 仍然,您必须在Checked
复选框时使用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 ……
首先,使用单个字符串属性创建一个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 ... }
( * )例如,简短描述然后将其绑定在View上。 这种MVVM模式的主要优点是逻辑分离,因此如果必须更改某些内容,则每个组件的分离会使其更容易。
二,创建一个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(); }
现在,你几乎已经完成了所有设置; 你有Model,你有ViewModel,剩下的就是创建与View的连接。 这可以通过绑定轻松完成。 ViewModel表示控件的DataContext
(在您的情况下为LongListSelector
,因此在View的(Page)构造函数中,编写以下语句:
yourListControlName.DataContext = App.Hobbies;
现在绑定是唯一剩下的东西。 这是在XAML代码中完成的。 我不会在这里放一大块XAML代码,因为你最了解控件的外观。 不过,根据您提供的简短样本判断,仅进行一些调整:
列表XAML控件的项源将绑定到表示控件的DataContext
的ViewModel
的ObservableCollection
对象名。 有点模糊,对吧? 为了更清楚,在这种情况下,您需要编写ItemsSource="{Binding HobbiesCollection}"
, ObservableCollection
。 此外,在模板中,您应该具有绑定在Model
的属性上的CheckBox
:
//StackPanel is kinda useless if you have //only one child control in it. But I wrote //according to your code.
现在,这里的事情有点不清楚。 你为什么要使用Checkbox? 我想到了下一个可能的场景:你通过反序列化Json数据来获得一些你的爱好。 要将它们添加到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
属性为true
那些业余爱好对象。
祝好运!
我发现了一个更简单的解决方案
我的模特
你需要使用两个变量,否则你可能会得到’stackoverflowexception’
public class ModelObj { public int position { set; get; } public bool isChecked { get { return IsChecked; } set { IsChecked = value; } } public bool IsChecked; }
要在xaml中添加的代码:
-
isChecked in xaml设置ListView复选框
-
Mode = TwoWay更新模型类的isChecked布尔值
c#处理事件的代码
private void checkBox_Checked(object sender, RoutedEventArgs e) { foreach (ModelObj obj in listItem) { if (obj.isChecked == true) { int selectedPosition = obj.position; } } }