wpf - 将字符串列表作为复选框绑定(bind)到 UI?

标签 wpf binding

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

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

最佳答案

您可以通过绑定(bind) 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> 中的属性(property)类。

如果您需要 CheckBox要拥有 3 种状态(选中/未选中/不确定),只需将 IsChecked 声明为 bool?而不是 bool .

关于wpf - 将字符串列表作为复选框绑定(bind)到 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5703727/

相关文章:

wpf - 在 WPF 中更改切换按钮的自定义行为

wpf - 绑定(bind)到设置中定义的值

wpf - MVVM 中带有 Treeview 的 HierarchicalDataTemplate

c# - WPF:如何遍历窗口中的所有控件?

c# - Wpf 弹出窗口放置

javascript - 如果绑定(bind)空/未定义(带过滤器),Angularjs模板默认值

c# - 绑定(bind) List<string> 到 ComboBox

c# - 在 WPF 中填写所有字段之前,表单验证禁用提交按钮

c# - 完全模态 WPF 窗口?

c# - 嵌套 UserControl 事件在 MVVM/WPF 场景中不适用于 EventTrigger/InvokeCommandAction