我有30个复选框。如果我选中任何6复选框,则应禁用剩余24复选框,如果我取消选中6中的任何一个复选框,则应启用所有复选框。
<Style TargetType="{x:Type ListBox}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="4"
CornerRadius="5" Margin="6"
>
<CheckBox Uid="checkbox1" Name="checkbox1" Checked="CheckBox_Checked" Unchecked="CheckBox_UnChecked" IsChecked="{Binding ElementName=button,Path=IsChecked,Mode=OneWay}">
<Image
Source="{Binding Path=UriSource}"
Stretch="Fill"
Width="100" Height="120"
/>
</CheckBox>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
<ListBox Name="List1" ItemsSource="{Binding}" Margin="-50,-8,93,0" RenderTransformOrigin="0.5,0.5" Height="289" VerticalAlignment="Top" >
<ListBox.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="0.975" ScaleY="0.997"/>
<SkewTransform AngleY="-8.98" AngleX="9.705"/>
<RotateTransform Angle="9.419"/>
<TranslateTransform Y="76.889" X="64.258"/>
</TransformGroup>
</ListBox.RenderTransform>
</ListBox>
C#:
if (iList.Count == 6) { List1.IsEnabled = false; }
它会禁用整个列表框。 ilist包含已选中复选框值的集合。
任何方法都可以吗? 请帮帮我。
答案 0 :(得分:0)
如果你想单独禁用复选框,我建议绑定到他们的IsEnabled属性。每次检查或取消选中列表框时,你都可以遍历你的列表,看是否检查了6个项目。如果是这样,您可以再次遍历列表,并为每个尚未检查的项目将现在绑定的IsEnabled属性设置为false。我猜您正在使用代码,但我建议您使用viewmodel。这看起来像这样:
<强>视图模型强>
public class TestViewModel
{
private bool _disabledCheckBoxes;
public TestViewModel()
{
TestList = new ObservableCollection<CheckBoxItem>();
for (int i = 0; i < 30; i++)
{
TestList.Add(new CheckBoxItem(true));
}
}
public ObservableCollection<CheckBoxItem> TestList { get; set; }
public RelayCommand CheckBoxChanged
{
get { return new RelayCommand(OnCheckBoxChanged); }
}
private void OnCheckBoxChanged()
{
if (_disabledCheckBoxes)
{
foreach (var item in TestList)
{
item.IsEnabled = true;
}
_disabledCheckBoxes = false;
}
else
{
int i = 0;
foreach (var item in TestList)
{
if (item.IsChecked)
i++;
}
if (i >= 6)
{
foreach (var item in TestList)
{
if (!item.IsChecked)
item.IsEnabled = false;
}
_disabledCheckBoxes = true;
}
}
}
}
<强> CheckBoxItem 强>
public class CheckBoxItem : ObservableObject
{
public CheckBoxItem(bool isEnabled)
{
IsEnabled = isEnabled;
}
private bool _isEnabled;
public bool IsEnabled
{
get
{
return _isEnabled;
}
set
{
_isEnabled = value;
RaisePropertyChanged("IsEnabled");
}
}
private bool _isChecked;
public bool IsChecked
{
get
{
return _isChecked;
}
set
{
_isChecked = value;
RaisePropertyChanged("IsChecked");
}
}
}
Xaml代码/视图
<Window x:Class="WpfAppTests.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfAppTests"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
mc:Ignorable="d"
xmlns:modelNoMvvmLight="clr-namespace:WpfAppTests"
xmlns:modelMvvmLight="clr-namespace:WpfAppTests.ViewModel"
Loaded="Loaded_Window"
Title="MainWindow" Height="350" Width="525" >
<Window.DataContext>
<modelMvvmLight:TestViewModel/>
</Window.DataContext>
<StackPanel>
<ListBox ItemsSource="{Binding TestList}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}" IsEnabled="{Binding IsEnabled}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.CheckBoxChanged}"/>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.CheckBoxChanged}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Window>
我使用命令CheckBoxChanged(在视图模型中)绑定Checked和UnChecked事件,因此每次复选框的状态发生变化时,都可以验证您的需求(已检查项目== 6)。 我在我的示例中使用了MvvmLight,但如果您考虑使用mvvm模式并且不想使用框架,则可以实现ObservableObject和RelayCommand yourself。