【问题标题】:How can I get the checked checkbox values using MVVM?如何使用 MVVM 获取选中的复选框值?
【发布时间】:2014-08-04 14:56:58
【问题描述】:

现在,我正在开发一个 WPF 项目。

我有一个确认对话框,其中显示了用户从 CSV 文件导入的重复字符串列表。

用户可以勾选想要添加到列表(列表视图)中的重复字符串,然后单击确定。

问题是我不确定如何获取选中的复选框项目的值并将它们添加到列表中。我如何知道选择了哪个复选框并将所选项目添加到列表中?

我想使用 MVVM 而不是隐藏代码来完成这项任务。我看过一些使用代码的例子,但它们仍然让我感到困惑。

我想我必须使用命令,但我仍然不确定如何获取选中的复选框值?

这是我的尝试:

ViewModel 中的代码:

private bool isSelected;
    public bool IsSelected
    {

        get
        {

            return isSelected;
        }

        set
        {

            isSelected = value;
            RaisePropertyChanged("IsSelected");

            if (IsSelected == true)
            {

                foreach (var item in confirmationList.PassList)
                {

                    List.Add(item);
                }

                RaisePropertyChanged(LIST);

            }

            else if (IsSelected == false)
            {

            }
        }
    }

XAML:

<Grid>
<ListView ItemsSource="{Binding Inventory}">
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                         <CheckBox Content="{Binding}" IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

            <GridViewColumn DisplayMemberBinding="{Binding Name}"
                            Header="Name">
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

不确定从这里可以做些什么来获得选中的值?

编辑:更新 xaml 以反映外观。

【问题讨论】:

    标签: c# wpf mvvm checkbox


    【解决方案1】:

    首先定义一个模型类

     public class ListModel
     {
         public string Data { get; set; }
         public bool IsSelected { get; set; }
     }
    

    然后将这个模型的列表绑定到Listview的ItemsSource

    List<ListModel> data = new List<ListModel>();
    

    将你的复选框的绑定修改为

    <CheckBox Content="{Binding Data}" IsChecked="{Binding Path=IsSelected, Mode=TwoWay"/>
    

    然后当您需要检索时,您可以执行以下 linq 以获取所有选定的字符串

    IEnumerable<String> selectedData = data.Where(d => d.IsSelected).Select(d => d.Data);
    

    现在您将在字段 selectedData 中获得在 UI 中选择的所有数据

    【讨论】:

    • 我需要一个模型类吗?如果我的列表只是我的视图模型中的 List 怎么办?我在使用 List 时遇到了问题。它说,“字符串”不包含“IsSelected”的定义,并且找不到接受“字符串”类型的第一个参数的扩展方法“IsSelected”(您是否缺少 using 指令或程序集引用?)
    • 如果您不喜欢使用数据类,那么可能很难将视图模型中的单个 isselected 属性绑定到表示您的字符串列表的复选框。你可以使用转换器,但在这种情况下,你可能需要编写一个转换器类。
    • 使用 ObservableCollection 代替 List
    【解决方案2】:

    一个很好的方法是创建一个新类,因为当您必须将属性绑定到 Grid、ItemsControl 或其他使用 ItemsSource 的元素时会更容易。

    在您的模型中,该类将是...

    public class ListModel: INotifyPropertyChanged
    {
        private bool isSelected;
        public bool IsSelected
        {
            get { return isSelected; }
            set
            {
                if (isSelected != value)
                {
                    isSelected = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
                    }
                }
            }
        }
    }
    

    您将此属性绑定到 CheckBox

    <ItemsControl  ItemsSource="{Binding ListModelBinding, Mode=TwoWay}">
         <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" />
    </ItemsControl>
    

    在您的视图模型中

    private ObservableCollection<ListModel> _listModelBinding;
    public ObservableCollection<ListModel> ListModelBinding
        {
            get { return _listModelBinding; }
            set { _listModelBinding= value; RaisePropertyChanged("ListModelBinding"); }
        }    
    

    该解决方案提供多个项目。如果您只有一个属性,只需像我在 ViewModel 中创建 ListModelBinding 一样创建一个 bool 属性,然后将此属性绑定到 xaml 中的 CheckBox。

    当您想要检索数据时,只需在 ListModelBinding 中应用 Linq 即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-29
      • 2012-07-02
      • 2013-01-06
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多