![](/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.