将字符串列表绑定到UI作为复选框?

Ent*_*ity 3 wpf binding

我有一个List<String>自定义用户控件.每当List<String>修改,我希望自定义用户控件具有每个项目的复选框List<String>.我最初的想法(习惯于Java)只是添加复选框并直接删除它们.

但是......我知道C#可以做得更好.有没有什么方法可以将字符串"绑定"到UI,以便它们显示为复选框?(或任何其他有效的方法?)

Tho*_*que 8

您可以通过绑定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.