WPF复选框命令到列表或从列表

时间:2015-09-29 16:33:05

标签: c# wpf checkbox

我是WPF的新手,并不确定无论我想做什么都可能。

我有以下复选框: -

<CheckBox Name="cbAccess" Checked="cbAccess_CheckedChanged" Unchecked="cbAccess_CheckedChanged">Access To Save</CheckBox>

列表如下: -

List<int> accessList = new List<int>();

如果选中复选框,那么它应该触发命令10(int),我将在某些列表中添加10。然后取消选中然后从列表中删除。

当第一次加载窗口时,将根据列表中是否存在commnad 10来检查或取消选中复选框。

1 个答案:

答案 0 :(得分:1)

CheckBox来自ButtonBase,因此您可以自动获得对CommandCommandParameter的访问权限。 (MSDN)使用这些,您可以想象做类似的事情:

<CheckBox Command="{Binding ToggleItemInListCommand}" CommandParameter="10"/>

并拥有命令功能:

private void ToggleItemInList(object param)
{
    int item;
    if (int.TryParse(param.ToString(), out item))
    {
       //If its actually an int
       if (myList.Contains(item))
           myList.Remove(item);
       else
           myList.Add(item);
    }
}

通过ICommand公开该方法是微不足道的,并留给您。虽然这样的解决方案可行,但它无法解决将初始状态转换为CheckBox的问题。 “ 鉴于您也想要这种行为,我不会在这里使用命令,而是使用带有转换器的IsChecked。不幸的是,您需要在DependencyProperty上将集合放入转换器中才能使其正常工作。 XAML看起来像:

<!-- Resources -->
<local:ListContainsConverter x:Key="ListContainsConverter" Collection="{Binding MyList}"/>
<!-- Main Section -->
<CheckBox IsChecked="{Binding Path=., Converter={StaticResource ListContainsConverter}, ConverterParameter=10}"/>

定义ListContainsConverter的位置:

public class ListContainsConverter : DependencyObject, IValueConverter
{
    public object Convert(...)
    {
        //More generic version left as an exercise
        int testValue = int.Parse(parameter.ToString());
        return collection.Contains(testValue);
    }

    public object ConvertBack(...)
    {
        bool checked = (bool)value;
        int testValue = int.Parse(parameter.ToString());

        if (checked)
           Collection.Add(testValue);
        else
           Collection.Remove(testValue)
    }

    public IList<int> Collection
    {
       get { return (IList<int>)GetValue(CollectionProperty); }
       set { SetValue(CollectionProperty, value); }
    }

    public static readonly DependencyProperty CollectionProperty =
    DependencyProperty.Register("Collection", typeof(IList<int>), typeof(ListContainsConverter), null);

}

这种方法确实好得多,因为保持状态更容易。你忽略了转换器的value部分,这有点奇怪,但我会在这里取消。