【问题标题】:How to get checked checkbox content in windows phone app?如何在 Windows Phone 应用程序中获取选中的复选框内容?
【发布时间】:2017-01-09 14:46:40
【问题描述】:

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

请帮帮我...

【问题讨论】:

    标签: c# checkbox windows-phone


    【解决方案1】:

    我认为您没有按照目的正确使用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();
    }
    

    现在,您几乎已准备就绪;你有模型,你有视图模型,剩下的就是创建与视图的连接。这可以通过绑定轻松完成。 ViewModel 代表您的控件的DataContext(在您的情况下为LongListSelector,因此在该视图的(页面)构造函数中,编写以下语句:

    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 的爱好对象。

    祝你好运!

    【讨论】:

    • 首先谢谢你重播。你能给我编码吗?我想要那个检查值,因为我想在 json 中序列化它,然后发送到数据库。你能给我一些例子吗?它会容易理解我忘记了什么或我的错误是什么。?
    • 您必须提供有关您的问题的更多详细信息。本质上,我想概述的是您使用了错误的事件。如果您希望仅在选中复选框时发生某些事情(在取消选中时不发生),请使用 Checked 事件。
    • 我有一页显示爱好。这是我通过反序列化我的 Web 客户端响应得到的。现在,当用户标记检查爱好复选框时,我想要的所有爱好都在一个特定列表中或 array.then 在 json 中序列化它以在用户配置文件中发送更新爱好。
    • 当你得到反序列化后的爱好列表时,你应该构建一些视图模型(MVVM)显示在视图(页面)上,用户进行更改(选择/取消选择等) ,然后分析LongListSelecter的ItemSource得到改变的爱好,重构Json发送的格式,更新profile。
    • 是的先生,我想要的和你理解的完全一样,但我是这项技术的新手,所以我不知道 mvvm 所以你能帮我吗?来解决这个问题。
    【解决方案2】:

    我找到了一个更简单的解决方案。

    我的模特

    你需要使用两个变量,否则你可能会得到一个'stackoverflowexception'

        public class ModelObj
        {
            public int position { set; get; }
            public bool isChecked
            {
                get { return IsChecked; }
                set { IsChecked = value; }
            }
            public bool IsChecked;
        }
    

    要在 xaml 中添加的代码:

    1. xaml 中的 isChecked 设置 ListView 复选框

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多