绑定到列表视图和复选框

本文关键字:复选框 视图 列表 绑定 | 更新日期: 2023-09-27 17:58:43

我有以下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>

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

绑定到列表视图和复选框

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>

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

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

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

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