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

时间:2011-04-18 13:37:48

标签: wpf binding

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

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

1 个答案:

答案 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