如何在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>

请帮帮我...

如何在Windows Phone应用程序中选中复选框内容

我认为您根据其目的没有正确使用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 控件的项源将绑定到表示控件DataContextViewModelObservableCollection对象名称。有点模糊吧?为了更清楚起见,在这种情况下,您需要写 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 中添加的代码:

  1. 在 xaml 中签入设置"列表视图"复选框

  2. 模式 = 双向更新模型类的已检查布尔值

    <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;
            }
        }
    }