如何使用MVVM获得选中的复选框值?

本文关键字:复选框 何使用 MVVM | 更新日期: 2023-09-27 18:08:38

现在,我正在做一个WPF项目。

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

用户可以勾选他们想要添加到列表(listview)中的重复字符串,然后单击ok。

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

我想使用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>

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

如何使用MVVM获得选中的复选框值?

首先定义一个模型类

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

现在UI中被选中的所有数据都在selectedData

字段中

一个很好的方法是创建一个新类,因为当您必须将属性绑定到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>

在你的ViewModel

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

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

当你想检索数据时,只在ListModelBinding中应用Linq,就是这样。