我正在开发Windows手机应用程序。在应用程序中,我想放多个复选框。我能够放多个复选框。但当我选中复选框时,我想获取其内容(复选框内容)。为此我我使用检查事件,也点击事件,但我不能得到我想要的结果。我的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>
请帮帮我......
答案 0 :(得分:2)
我认为您根据其目的未正确使用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 ...
}
( * )例如,简短描述然后将其绑定在View上。这种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();
}
现在,你几乎把它全部设定了;你有Model,你有ViewModel,剩下的就是创建与View的连接。这可以通过绑定轻松完成。 ViewModel代表控件的DataContext
(在您的情况下是LongListSelector
,因此在View的(Page)构造函数中,编写以下语句:
yourListControlName.DataContext = App.Hobbies;
现在绑定是唯一剩下的东西。这是在XAML代码中完成的。我不会在这里放一大块XAML代码,因为你最了解控件的外观。不过,根据您提供的简短样本判断,只有一些调整:
列表XAML控件的项目源将绑定到代表控件ObservableCollection
的{{1}}的{{1}}对象名称。有点模糊,对吧?为了更清楚,在这种情况下,您需要编写ViewModel
,DataContext
。此外,在模板中,您应该拥有绑定在ItemsSource="{Binding HobbiesCollection}"
属性上的ObservableCollection
:
CheckBox
现在,这里的事情有点不清楚。你为什么要使用Checkbox?我想到了下一个可能的场景:你通过反序列化Json数据来获得一些你的爱好。要将它们添加到Model
,您只需要:
<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>
这会使所有爱好都在ViewModel
中被选中。我想,你会添加一些其他的爱好,用户没有选择哪些,现在可以添加它们:
App.Hobbies.HobbiesCollection.Add(new Hobby("firstHobbyFromJson", true));
App.Hobbies.HobbiesCollection.Add(new Hobby("secondHobbyFromJson", true));
此时,用户在列表中拥有所有以前的爱好以及您提供给他的一些新爱好。在他的选择完成后,如果你需要仅用选定的爱好序列化Json,你可以这样:
View
或使用foreach并仅获取App.Hobbies.HobbiesCollection.Add(new Hobby("aNewHobby", false));
App.Hobbies.HobbiesCollection.Add(new Hobby("anotherNewHobby", false));
属性为var userHobbies = App.Hobbies.HobbiesCollection.Where(h => h.IsSelected);
的那些业余爱好对象。
答案 1 :(得分:1)
我找到了一个更简单的解决方案。
我的模特
您需要使用两个变量,否则可能会出现'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布尔值
<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;
}
}
}