如何在Windows Phone应用程序中选中复选框内容
本文关键字:复选框 应用程序 Windows Phone | 更新日期: 2023-09-27 18:32:11
我正在开发Windows Phone应用程序。在应用程序中,我想放置多个复选框。我可以放多个复选框。但是当我选中复选框时,我想获取其内容(复选框内容)。为此,我使用检查事件并单击事件,但我无法获得所需的结果。我的 xaml 代码如下:
<ListBox Name="hobbylist" ItemsSource="{Binding}" Margin="0,0,10,10" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Name="hobbycheck" Content="{Binding Path=Title}"
IsChecked="{Binding IsSelected}" ClickMode="Release"
Click="CheckBox_Click" ></CheckBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
请帮帮我...
我认为您根据其目的没有正确使用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...
首先,创建一个具有单个字符串属性的 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 模式的主要优点是逻辑分离,因此,如果必须更改某些内容,则每个组件的分离会使其更容易。
其次,创建一个 ViewModel 类(你应该实现 INotifyPropertyChanged 接口):
public class HobbiesViewModel : INotifyPropertyChanged
{
private ObservableCollection<Hobby> _hobbies;
public ObservableCollection<Hobby> HobbiesCollection
{
get
{
return _hobbies;
}
set
{
_hobbies = value;
OnPropertyChanged();
}
}
//Constructor
public HobbiesViewModel
{
HobbiesCollection = new ObservableCollection<Hobby>();
}
//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 表示控件的DataContext
(在本例中为 LongListSelector
),因此在该视图(Page)的构造函数中,编写以下语句:
yourListControlName.DataContext = App.Hobbies;
现在绑定是唯一剩下的东西。这是在 XAML 代码中完成的。我不会在此处放置一整块 XAML 代码,因为您最了解控件的外观。不过,从您提供的简短样本来看,只有一些调整:
列表 XAML 控件的项源将绑定到表示控件DataContext
的ViewModel
的ObservableCollection
对象名称。有点模糊吧?为了更清楚起见,在这种情况下,您需要写 ItemsSource="{Binding HobbiesCollection}"
,ObservableCollection
.此外,在模板中,您应该具有绑定在Model
属性上的CheckBox
:
<DataTemplate>
<StackPanel Orientation="Horizontal"> //StackPanel is kinda useless if you have
//only one child control in it. But I wrote
//according to your code.
<Checkbox Content="{Binding Name}" IsChecked="{Binding IsSelected, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
现在,这里的事情对我来说有点不清楚。为什么要使用复选框?我想到了下一个可能的情况:通过 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 中添加的代码:
在 xaml 中签入设置"列表视图"复选框
模式 = 双向更新模型类的已检查布尔值
<CheckBox IsChecked="{Binding isChecked , Mode=TwoWay}" Checked="checkBox_Checked" >
处理事件的 c# 代码
private void checkBox_Checked(object sender, RoutedEventArgs e)
{
foreach (ModelObj obj in listItem)
{
if (obj.isChecked == true)
{
int selectedPosition = obj.position;
}
}
}