WPF,C# - CheckEdit中的SelectAll

时间:2015-08-17 12:14:11

标签: c# wpf xaml mvvm devexpress-wpf

如何制作CheckEdit全选。

Xaml自动生成checkEdit

   <ItemsControl ItemsSource="{Binding MyProperty, Mode=TwoWay}" Margin="0"  Grid.Column="1" Grid.RowSpan="1" x:Name="MyCheck" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <dxe:CheckEdit Content="{Binding FilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Padding="2.5" Margin="3"  
                               IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Vertical"  />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

        <Button x:Name="filtrButton" Content="Filtr" Command="{Binding FiltrCommand}"  Padding="5" Margin="3" IsEnabled="{Binding IsEnabled}"/>
        <dxe:CheckEdit x:Name="CheckALL" Content="Select All" Padding="2.5" Margin="3" IsChecked="{Binding AllSelected}" />

C#

        private bool? _allSelected = true;
    public bool? AllSelected
    {
        get { return _allSelected; }
        set
        {
            _allSelected = value;

          MyProperty.ForEach(x => x.IsChecked = value);

            OnPropertyChange("AllSelected");
        }
    }
    public List<MyCheckBox> MyProperty
    {
        get { return TempList; }
        set
        {
            TempList = value;
            OnPropertyChange("MyProperty");
        }
    }
/// добавление название файла и его select
        public ViewModel(){
       TempList = new List<MyCheckBox>();

        foreach (var type in tempUniqueList)
        {
            TempList.Add(new MyCheckBox(type, _allSelected));
        }

        MyProperty = TempList;
    }

1 个答案:

答案 0 :(得分:0)

_allSelected是不必要的,因为它的状态来自是否检查其他项目。 (注意:这与选择不同,这意味着ItemsControls中的其他内容)

public bool? AllSelected
{
    get 
    { 
        // Check if all are checked
        if (!MyProperty.Any(x => !x.IsChecked))
        {
            return true;
        }

        // Check if none are checked
        if (!MyProperty.Any(x => x.IsChecked))
        {
            return false;
        }

        // Otherwise some are checked.
        return null;
    }

    set
    {
        _allSelected = value;

        MyProperty.ForEach(x => x.IsChecked = value);

        OnPropertyChange("AllSelected");
    }
}

现在,另一个重要的事情是,每当其中一个项目的IsChecked()值发生更改时,您需要引发 OnPropertyChanged(&#34; AllSelected&#34;)。在这一点上,这不是一个非常好的解决方案。您需要为插入到&#34; MyProperty&#34;中的每个项目挂钩PropertyChanged事件,测试它是否是 IsChecked 属性,如果是,则引发PropertyChanged。

就个人而言,我倾向于将此类事物视为View的更多部分,而不是View Model。我的意思是,&#34;选择全部/选择无&#34;复选框实际上是ItemsControl的扩展,从概念上讲。因此,您可能完全有理由在代码隐藏中执行此操作,并且只是连接到DataTemplate中的Checked()事件。