我有一个List<String>自定义用户控件.每当List<String>修改,我希望自定义用户控件具有每个项目的复选框List<String>.我最初的想法(习惯于Java)只是添加复选框并直接删除它们.
但是......我知道C#可以做得更好.有没有什么方法可以将字符串"绑定"到UI,以便它们显示为复选框?(或任何其他有效的方法?)
您可以通过绑定ItemsControl到字符串列表来轻松完成此操作:
<ItemsControl ItemsSource="{Binding Strings}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
然而,这不是很有用,因为你没有简单的方法来访问...的状态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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以公开列表CheckableItem<string>而不是字符串列表,并按如下方式更改XAML:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Value}" IsChecked="{Binding IsChecked}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
如果您需要测试是否CheckBox已选中,请仅测试该类中的IsChecked属性CheckableItem<T>.
如果你需要CheckBox有3个状态(选中/未选中/不确定),只需声明IsChecked bool?而不是bool.