Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
379 views
in Technique[技术] by (71.8m points)

c# - How to get checked checkbox content in windows phone app?

I am developing windows phone app .In app,I want to put multiple check box.I able to put multiple check box.But when i checked on check box i want getting its content(check box content).For that i am use checked event and also click event but i cant get result as i want.My xaml code is as below:

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

Please help me ...

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I think you are using the Checkbox not correctly according to its purpose.

Checkbox should represent a state (e.g. yes/no) regarding a subject. Still, you just have to use the Checked event when the checkbox gets checked and Unchecked otherwise.

So in the Checked event, get the content you wish.

Edit

You have to maintain this with the MVVM pattern somehow. For that, there are plenty of examples in the internet, I am sure you can handle that.

Instead of having Click="CheckBox_Click", use the Check event :

private void CheckBox_Checked (Object sender, EventArgs e)
{
    var currentCheckBoxItem = sender as CheckBox;
    if (currentCheckBoxItem.IsChecked == true)
        {
             //you manipulation here...
        }
}

Still. this might just not work, because you haven't provided enough details of your matter.

Edit 2 A little of MVVM...

First, make a Hobby model class, with a single string property (you might change your mind later to add more properties, 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 ...
}

(* ) For example, a short description and then bind it on the View. The major advantage of this MVVM pattern is logic separation, so if something has to change, the separation of each component makes it easier.

Second, create a ViewModel class (you should implement INotifyPropertyChanged interface) :

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

Third, create an instance of the ViewModel (the ObservableCollection). Use this quick help out : In the App.xaml.cs, create a static object and use it through the app as you need it :

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

Now, you almost have it all set; You have the Model, you have the ViewModel, all that's left is to create the connection with the View. This can be easily done through binding. The ViewModel represents the DataContext of your control (in your case the LongListSelector, so in that View's (Page's) constructor, write the following statement :

yourListControlName.DataContext = App.Hobbies;

Now the binding is the only thing left. This is done in XAML code. I won't put a whole chunk of XAML code here, cause you know best how your control looks like. Still, judging by the short sample you provided, there a few adjustments only :

The items source of the list XAML control will be bound to the ObservableCollection object name of the ViewModel representing the control's DataContext. A bit fuzzy, huh? To be clearer, in this case, you need to write ItemsSource="{Binding HobbiesCollection}", the ObservableCollection. Also, in the template, you should have that CheckBox which is bound on your Model's properties :

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

Now, here things are a bit unclear to me. Why would you use the Checkbox? I've thought of the next possible scenario : You come with some string of your hobbies through deserialization of the Json Data. To add them to the ViewModel, you need only :

App.Hobbies.HobbiesCollection.Add(new Hobby("firstHobbyFromJson", true));
App.Hobbies.HobbiesCollection.Add(new Hobby("secondHobbyFromJson", true));

This would make all hobbies already selected in the View. I guess, you would add some other hobbies, the user doesn't have which are not selected and could add them now :

App.Hobbies.HobbiesCollection.Add(new Hobby("aNewHobby", false));
App.Hobbies.HobbiesCollection.Add(new Hobby("anotherNewHobby", false));

At this point, the user has all its previous hobbies in the list and as well some new hobbies you provided him. After his selection is done, if you need to serialize the Json with only the selected hobbies, you could get like this :

var userHobbies = App.Hobbies.HobbiesCollection.Where(h => h.IsSelected);

or with a foreach and get only those hobby objects which have the IsSelected property as true.

Good luck!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...