checkbox wpf 绑定数组,在WPF中将控件绑定到集合/数组中的单个值

In WPF I have a collection of bool? values and I want to bind each of these to a separate checkbox programmatically. I want the bindings to be TwoWay so that changing the value of the individual item in the collection in code updates the check box and vice versa.

I have spent ages trying to figure out how to do this and I am completely stuck. With the following code the checkbox only gets the right value when the window is loaded and that's it. Changing the check box doesn't even update the value in the collection. (UPDATE: this appears to be a bug in .NET4 as the collection does get updated in an identical .NET3.5 project. UPDATE: Microsoft have confirmed the bug and that it will be fixed in the .NET4 release.)

Many thanks in advance for your help!

C#:

namespace MyNamespace

{

public partial class MyWindow : Window, INotifyPropertyChanged

{

public MyWindow()

{

InitializeComponent();

DataContext = this;

}

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)

{

if (PropertyChanged != null)

{

PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}

public List myCollection = new List

{ true, false, true, false, true, false };

public List MyCollection

{

get { return myCollection; }

set { myCollection = value; }

}

}

}

XAML:

解决方案

There are a few things that need changing here to get this to work. Firstly you'll need to wrap your boolean value in an object that implements the INotifyPropertyChanged interface in order to get the change notification that you are looking for. Currently you are binding to boolean values in your collection which do not implement the interface. To do this you could create a wrapper class like so :

public class Wrapper: INotifyPropertyChanged

{

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)

{

if (PropertyChanged != null)

{

PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}

}

private bool val = false;

public bool Val

{

get { return val; }

set

{

val = value;

this.OnPropertyChanged("Val");

}

}

public Wrapper(bool val)

{

this.val = val;

}

}

You'll then want to create these objects in your form instead of a list of booleans. You may also want to use an observable collection instead of a list so that notification of items being added and removed are sent. This is shown below:

public Window1()

{

InitializeComponent();

this.DataContext = this;

}

private ObservableCollection myCollection = new ObservableCollection()

{new Wrapper(true), new Wrapper(false), new Wrapper(true)};

public ObservableCollection MyCollection

{

get { return myCollection; }

}

The next thing to do is to display a list of check boxes in your ui. To do this WPF provides itemscontrols. ListBox is an itemscontrol so we can use this as a starting point. Set the itemssource of a listbox to be MyCollection. We then need to define how each Wrapper object is going to be displayed in the list box and this can be done with a datatemplate which is created in the windows resources. This is shown below :

This should get you up and running with a simple demo of checkboxes that have values bound to a list of booleans.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值