繁体   English   中英

在WPF中,如何将Checkbox的IsChecked绑定到List <>。Contains?

[英]In WPF, how do I two-way bind a Checkbox's IsChecked to property to List<>.Contains?

很抱歉,如果我的问题措辞不好,或者是否已经在某个地方回答了该问题,我已经进行了搜索,但是我真的不知道如何很好地解释我要做什么。

这是我已部分设置的一个简单测试床,以帮助说明:

MainWindow.xaml:

<Window x:Class="wpfExample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:wpfExample"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <ListView Grid.Column="0" ItemsSource="{Binding People}" DisplayMemberPath="Name"/>

    <ListBox Grid.Column="1" ItemsSource="{Binding Interests}" Margin="0,4,4,4">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

</Grid>

MainWindow.xaml.cs:

using System;
using System.Collections.ObjectModel;
using System.Windows;

namespace wpfExample
{
    public class Person
    {
        public string Name { get; set; }
        public ObservableCollection<Guid> Interests { get; set; }
    }

    public class Interest
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }

    public class Data
    {
        public ObservableCollection<Person> People { get; set; }
        public ObservableCollection<Interest> Interests { get; set; }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            DataContext = new Data
            {
                People = new ObservableCollection<Person>
                {
                    new Person {Name="Fred", Interests=new ObservableCollection<Guid>() },
                    new Person {Name="Jane", Interests=new ObservableCollection<Guid>() },
                    new Person {Name="Zach", Interests=new ObservableCollection<Guid>() }
                },
                Interests = new ObservableCollection<Interest>
                {
                    new Interest {Name="Gardening", Id=Guid.NewGuid() },
                    new Interest {Name="Writing", Id=Guid.NewGuid() },
                    new Interest {Name="Avoiding Tax", Id=Guid.NewGuid() }
                }
            };

            InitializeComponent();
        }
    }
}

所以我有一个包含两个列表的DataContext。 一个包含兴趣,其中包含一个名称和一个ID。 另一个包含具有名称和兴趣ID列表的人员。

当在UI中选择一个Person时,我希望能够向各自的列表中添加和删除兴趣ID,因此第1列中的ListView已绑定到兴趣列表,但是如何正确地绑定IsChecked属性列表中的复选框?

在我的整个项目中,通过使用带有MultiValueConverter的IsChecked的MultiBinding和MultiValueConverter,可以成功读取选定人员的兴趣列表的属性,从而一起传递人员的兴趣ID和人员的兴趣列表(自您以来不能将参数的绑定用于“常规”值转换器)。 我觉得此解决方案有点滥用转换器,但如有必要,我很乐意坚持使用。

我如何实现一个系统,当复选框切换时,该系统将允许我在个人兴趣列表中添加和删除兴趣指南? 有没有更干净的方法可以做到这一点? 如果可以避免,我不想更改模型。

我不会说您的MultiConverter解决方案完全是一种滥用。 您正在执行转换器应该执行的操作(获取一组数据并转换为目标类型,然后返回)。

话虽如此; 转换器由于它们的通用性(使用object )而有些混乱,对于Multi Converters来说是双重的,因此,如果您想要一个不同的解决方案,我建议为Interest创建一个视图模型包装器; Selectable<T>

public class Selectable<T>
{
     public T Data {get; set;}
     public bool Selected {get; set;}
}

然后更新您的财产

public ObservableCollection<Selectable<Interest>> Interests { get; set; }

并将IsChecked直接绑定到Selected

然后,无论何时更改选定的Person ,您都可以适当地更新Selected属性。 将先前的值存储给其他Person等。这在某种程度上取决于何时需要在模型中反映用户操作。

综上所述,这两种方法都是完全有效的,这取决于您最满意的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM