如何获取Windows Phone应用程序中的复选框内容?

时间:2013-09-20 08:56:46

标签: c# checkbox windows-phone

我正在开发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>

请帮帮我......

2 个答案:

答案 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}}对象名称。有点模糊,对吧?为了更清楚,在这种情况下,您需要编写ViewModelDataContext。此外,在模板中,您应该拥有绑定在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中添加的代码:

  1. isChecked in xaml设置ListView复选框

  2. Mode = TwoWay更新模型类的isChecked布尔值

    <CheckBox IsChecked="{Binding isChecked , Mode=TwoWay}"  Checked="checkBox_Checked" >
    
  3. c#处理事件的代码

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