簡體   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