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

时间:2014-06-14 00:59:24

标签: c# wpf mvvm checkbox

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

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

用户可以检查要添加到列表(listview)的重复字符串,然后单击“确定”。

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

我想使用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以反映外观。

2 个答案:

答案 0 :(得分:2)

首先定义一个模型类

 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中选择的所有数据

答案 1 :(得分:0)

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