在 WPF 中我有一个 bool 集合?值,我想以编程方式将它们中的每一个绑定(bind)到一个单独的复选框。我希望绑定(bind)是双向的,以便在代码中更改集合中单个项目的值会更新复选框,反之亦然。
我花了很长时间试图弄清楚如何做到这一点,但我完全被困住了。使用以下代码,复选框仅在加载窗口时获得正确的值,仅此而已。更改复选框甚至不会更新集合中的值。 (更新:这似乎是 .NET4 中的一个错误,因为该集合确实在相同的 .NET3.5 项目中得到更新。更新:Microsoft 已确认该错误并将在 .NET4 版本中修复。)
非常感谢您的帮助!
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<bool?> myCollection = new List<bool?>
{ true, false, true, false, true, false };
public List<bool?> MyCollection
{
get { return myCollection; }
set { myCollection = value; }
}
}
}
XAML:
<CheckBox IsChecked="{Binding Path=MyCollection[0], Mode=TwoWay}">
最佳答案
这里有几处需要更改才能使其正常工作。首先,您需要将 bool 值包装在一个实现 INotifyPropertyChanged 接口(interface)的对象中,以便获得您正在寻找的更改通知。当前,您绑定(bind)到集合中未实现该接口(interface)的 bool 值。为此,您可以像这样创建一个包装类:
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;
}
}
然后您将希望在表单中创建这些对象而不是 bool 值列表。您可能还想使用可观察的集合而不是列表,以便发送添加和删除项目的通知。如下所示:
public Window1()
{
InitializeComponent();
this.DataContext = this;
}
private ObservableCollection<Wrapper> myCollection = new ObservableCollection<Wrapper>()
{new Wrapper(true), new Wrapper(false), new Wrapper(true)};
public ObservableCollection<Wrapper> MyCollection
{
get { return myCollection; }
}
接下来要做的是在用户界面中显示复选框列表。为此,WPF 提供了项目控件。 ListBox 是一个项目控件,所以我们可以以此为起点。将列表框的项目源设置为 MyCollection。然后我们需要定义每个 Wrapper 对象将如何显示在列表框中,这可以使用在 Windows 资源中创建的数据模板来完成。如下所示:
<Window.Resources>
<DataTemplate x:Key="myCollectionItems">
<CheckBox IsChecked="{Binding Path=Val, Mode=TwoWay}"></CheckBox>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Path=MyCollection}" ItemTemplate="{StaticResource myCollectionItems}"></ListBox>
</Grid>
这应该让您通过一个简单的复选框演示开始运行,这些复选框的值绑定(bind)到 bool 值列表。
关于c# - 将控件绑定(bind)到 WPF 中的集合/数组中的单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2082451/