gpt4 book ai didi

c# - 如何将 ObservableCollection 绑定(bind)到 WPF 中的复选框列表框

转载 作者:行者123 更新时间:2023-11-30 13:47:18 25 4
gpt4 key购买 nike

让我先声明一下我对 C# 和 WPF 都很陌生。

我正在尝试将一组 Boolean 值连接到包含 6 个复选框的容器,并在按下按钮时存储这些值的状态。我假设有一种简单的方法可以做到这一点,因为将复选框绑定(bind)到集合似乎是一件很自然的事情,但到目前为止我看到的所有解决方案似乎都过于复杂(例如:http://merill.net/2009/10/wpf-checked-listbox/)。

我通过修改 ListBox 的数据模板创建复选框,并将 ListBoxItemsSource 设置为 ObservableCollection,但我的问题是我不知道将 IsChecked 绑定(bind)到什么,因为我试图将它绑定(bind)到集合中的实际对象而不是对象的属性.

最佳答案

使用IsChecked="{Binding}"直接绑定(bind)集合中的item。

<ListBox ItemsSource="{Binding MyBooleanCollection}" >
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Mode=OneWay}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

但是,无法使用此方法绑定(bind)到源。因为 CheckBoxIsChecked 属性上的绑定(bind)不是绑定(bind)项的索引。因此,它不能更改集合,只能更改集合中的项目。

更新

要绕过该限制,您可以为 bool 值创建一个包装器:

public class Wrapper<T> : INotifyPropertyChanged
{
private T value;
public T Value
{
get { return value; }
set
{
{
this.value = value;
OnPropertyChanged();
}
}
}

public static implicit operator Wrapper<T>(T value)
{
return new Wrapper<T> { value = value };
}
public static implicit operator T(Wrapper<T> wrapper)
{
return wrapper.value;
}

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}

这里是一个用法的例子:

public partial class MainWindow : Window
{
public ObservableCollection<Wrapper<bool>> MyBooleanCollection { get; private set; }

public MainWindow()
{
InitializeComponent();

DataContext = this;
MyBooleanCollection = new ObservableCollection<Wrapper<bool>>() { false, true, true, false, true };
}
}

在 XAML 中:

<CheckBox IsChecked="{Binding Value}"/>

关于c# - 如何将 ObservableCollection<bool> 绑定(bind)到 WPF 中的复选框列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17810092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com