如何在列表框wpf中禁用未选中的复选框?

时间:2018-04-05 06:20:16

标签: wpf checkbox listbox

我有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包含已选中复选框值的集合。

任何方法都可以吗? 请帮帮我。

1 个答案:

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