我在自定义用户控件中有一个List<String>
。每当List<String>
被修改时,我希望自定义用户控件具有List<String>
中每个项目的复选框。我最初的想法(习惯于Java)只是添加复选框并直接删除它们。
但是......我知道C#可以做得更好。有没有什么方法可以将字符串“绑定”到UI,以便它们显示为复选框? (或任何其他有效的方法?)
答案 0 :(得分:8)
您可以通过将ItemsControl
绑定到字符串列表来轻松完成此操作:
<ItemsControl ItemsSource="{Binding Strings}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
然而,这不是很有用,因为你没有简单的方法来访问CheckBox
的状态...更好的选择是将字符串包装在一个同样暴露bool
的类中属性:
public class CheckableItem<T> : INotifyPropertyChanged
{
public CheckableItem(T value)
{
_value = value;
}
private T _value;
public T Value
{
get { return _value; }
set
{
_value = value;
OnPropertyChanged("Value");
}
}
private bool _isChecked;
public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
OnPropertyChanged("IsChecked");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
然后,您可以公开CheckableItem<string>
的列表而不是字符串列表,并按如下方式更改XAML:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Value}" IsChecked="{Binding IsChecked}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如果您需要测试是否选中了CheckBox
,只需测试IsChecked
类中的CheckableItem<T>
属性。
如果您需要CheckBox
有3个州(选中/取消选中/不确定),只需将IsChecked声明为bool?
而不是bool
。