我是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来检查或取消选中复选框。
答案 0 :(得分:1)
CheckBox
来自ButtonBase
,因此您可以自动获得对Command
和CommandParameter
的访问权限。 (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
部分,这有点奇怪,但我会在这里取消。