绑定到Listview和Checkbox

时间:2016-07-27 08:38:12

标签: c# wpf

我有以下XAML代码:

<ListView Name="UserConfigurationListView" ItemsSource="{Binding Groups}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock  Text="{Binding Path=GROUP_NAME}" />
                <CheckBox IsChecked="{Binding GroupIsChecked}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListView>

群组是我的数据库中的表格,其中包含GROUP_NAME列,但不包含GroupIsChecked。到目前为止,我设法显示TextBlock但我不知道如何将Checkbox设置为true / false。问题是GroupIsChecked不在我的表中,我想检查一些条件将其设置为true / false。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

MVVM的主要思想是有一个“中间”类将您的模型链接到您的视图。

在您的情况下,模型类是数据库表对象,您的视图是您的UI。

您需要编写一个表示表中行的ViewModel类,并且您可以在其中编写所需的任何属性。 这些ViewModel的集合将成为您的“中间”表。 将此集合绑定到ListView。

GroupIsChecked属性不应该在您的表上,因此您可以在ViewModel类中实现其逻辑。 也许您可以为GROUP_NAME提供更合适的名称,例如GroupName,依此类推表格中的所有列。

答案 1 :(得分:1)

OrMiz对于为视图实现视图模型是正确的。

我不是MVVM专家,但这里有一个如何做到这一点的例子。 欢迎反馈。

代表你的组表的类......

public class GroupTable
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }
}

可以在列表视图中代表一行的视图模型玻璃...

public class GroupViewModel : INotifyPropertyChanged
{
    public GroupViewModel(GroupTable group)
    {
        this.GroupName = group.Name;
        this.GroupIsChecked = GroupCheckedLogic();
    }

    private string _GroupName;

    public string GroupName
    {
        get { return _GroupName; }
        set
        {
            _GroupName = value;
            OnPropertyChanged();
        }
    }

    private bool _GroupIsChecked;

    public bool GroupIsChecked
    {
        get { return _GroupIsChecked; }
        set
        {
            _GroupIsChecked = value;
            OnPropertyChanged();
        }
    }

    private bool GroupCheckedLogic()
    {
        // Your logic goes here
        return true;
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }
}

然后是视图的主视图模型......

public class GroupListViewModel : INotifyPropertyChanged
{
    public GroupListViewModel()
    {
        // Get your actual data
        var groupsData = new List<GroupViewModel>
        {
            new GroupViewModel(new GroupTable {Id = 1, Name = "Group 1"}),
            new GroupViewModel(new GroupTable {Id = 2, Name = "Group 2"})
        };

        this.Groups = new ObservableCollection<GroupViewModel>(groupsData);
    }

    private ObservableCollection<GroupViewModel> _Groups;

    public ObservableCollection<GroupViewModel> Groups
    {
        get { return _Groups; }
        set
        {
            _Groups = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后在你的XAML ......

<ListView Name="UserConfigurationListView" ItemsSource="{Binding Groups}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding GroupName}" />
                    <CheckBox IsChecked="{Binding GroupIsChecked}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListView>