![](/img/trans.png)
[英]How can I bind a WPF checkbox's IsChecked property to a boolean property of an object that is not a window
[英]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.