C# 在WPF中,如何双向绑定复选框';已选中要列出的属性<>;。包含?

C# 在WPF中,如何双向绑定复选框';已选中要列出的属性<>;。包含?,c#,wpf,C#,Wpf,很抱歉,如果我的问题措辞不好,或者在某个地方得到了回答,我已经搜索过了,但我真的不知道如何解释我要做的事情 下面是一个简单的测试台,我已经部分设置了它来帮助解释: MainWindow.xaml: <Window x:Class="wpfExample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.

很抱歉,如果我的问题措辞不好,或者在某个地方得到了回答,我已经搜索过了,但我真的不知道如何解释我要做的事情

下面是一个简单的测试台,我已经部分设置了它来帮助解释:

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();
        }
    }
}
使用系统;
使用System.Collections.ObjectModel;
使用System.Windows;
名称空间wpfExample
{
公共阶层人士
{
公共字符串名称{get;set;}
公共可观察集合利益{get;set;}
}
公共阶级利益
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
}
公共类数据
{
公共可观察集合人员{get;set;}
公共可观察集合利益{get;set;}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
DataContext=新数据
{
人员=新的可观察集合
{
新人{Name=“Fred”,兴趣=新的ObservableCollection()},
新人{Name=“Jane”,兴趣=新的ObservableCollection()},
新人{Name=“Zach”,兴趣=新的ObservableCollection()}
},
利息=新的可观察集合
{
新兴趣{Name=“gardenting”,Id=Guid.NewGuid()},
新兴趣{Name=“Writing”,Id=Guid.NewGuid()},
新利息{Name=“避税”,Id=Guid.NewGuid()}
}
};
初始化组件();
}
}
}
所以我有一个包含两个列表的DataContext。其中一个包含兴趣,有名字和ID。另一个包含有名字和兴趣ID列表的人

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

在我的整个项目中,我已经能够成功地读取所选人员兴趣列表的属性,方法是使用多值转换器对IsChecked进行多重绑定,将兴趣Id和人员的兴趣列表一起传递(因为不能对“正常”值转换器使用参数绑定)。我觉得这个解决方案有点滥用转换器,但如果有必要,我很乐意坚持使用它


我如何实现一个系统,允许我在切换复选框时向一个人的兴趣列表添加和删除兴趣GUID?有没有更干净的方法?如果可以避免的话,我不想改变模型。

我不会说你的多转换器解决方案是一种滥用;您正在做转换器应该做的事情(获取一组数据并转换为目标类型,然后返回)

话虽如此,;转换器由于其通用性(使用
对象
)而有点混乱,对于多个转换器来说这是双倍的,因此如果您想要不同的解决方案,我建议为
兴趣
创建一个视图模型包装器;说
可选

公共类可选
{
公共T数据{get;set;}
已选择公共布尔值{get;set;}
}
然后更新您的属性

public ObservableCollection<Selectable<Interest>> Interests { get; set; }
公共可观测集合利益{get;set;}
并将
IsChecked
直接绑定到
Selected

然后,无论何时更改所选的
人员
,您都可以适当地更新所选的
属性;将以前的值存储到另一个
,等等。这在某种程度上取决于何时需要在模型中反映用户操作


尽管如此,这两种方法都是完全有效的,这取决于您最满意的方法。

谢谢,我在解决方案中使用了这一点作为灵感,完全避免了价值转换。我想我已经深入到让价值转换器工作的绑定参数,我没有真正考虑不同的方法。
public ObservableCollection<Selectable<Interest>> Interests { get; set; }