【问题标题】:WPF ListView Header Checkbox and MVVM CommandWPF ListView 标题复选框和 MVVM 命令
【发布时间】:2015-02-16 17:01:48
【问题描述】:

我的 WPF 应用程序中有一个列表视图,第一列是一个复选框。此复选框绑定到我的模型的 IsSelected 属性,并且事件传播正确发生。

我在同一列的标题中也有一个复选框,并希望实现一个“全选”功能,以检查所有列表视图项。

我正在使用模式 MVVM。

事件没有触发!

有人能解释一下我在这里做错了什么吗..

下面提到了相关的代码部分..

XAML:

<ListView Grid.Row="0"
                            ItemsSource="{Binding Path=WorkOrders}"
                            Margin="5,10,5,5" 
                            Name="WorkOrders" 
                            SelectionMode="Multiple"
                            FontSize="13"
                            Background="AliceBlue"
                            BorderBrush="AliceBlue">

            <!--Style of items-->
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <!--Properties-->
                    <Setter Property="Control.HorizontalContentAlignment" Value="Stretch" />
                    <Setter Property="Control.VerticalContentAlignment" Value="Center" />
                    <!--Trigger-->
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="{x:Null}" />
                            <Setter Property="BorderBrush" Value="{x:Null}" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListView.ItemContainerStyle>

            <ListView.View>
                <GridView >
                    <GridViewColumn CellTemplate="{StaticResource CheckBoxDataTemplate}" Width="80" >
                        <GridViewColumn.HeaderTemplate>
                            <DataTemplate>

                                    <CheckBox Command="{Binding Path=SelectAllCommand}"  />
                            </DataTemplate>
                        </GridViewColumn.HeaderTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="WorkOrder" CellTemplate="{StaticResource DetailIdenTemplate}"  Width="300"/>
                </GridView>
            </ListView.View>
        </ListView>

型号:

public class WorkOrder
{
    public int CD_WORK_ORDER { get; set; }
    public string ID_WORK_ORDER { get; set; }
    public bool IsSelected { get; set; }
}

视图模型:

    public class LockWorkOrderSelectionViewModel : ViewModelBase
        {
            RelayCommand _selectAllCommand;
            public ICommand SelectAllCommand
            {
                get
                {
                    if (_selectAllCommand == null)
                    {
                        _selectAllCommand = new RelayCommand(
                            param => SelectAllElement(),
                            param => CanSelectAll);
                    }
                    //RaiseEvent(new RoutedEventArgs(SearchEvent));
                    return _selectAllCommand;
                }
            }

            private bool _selectedAllElement;
            public bool SelectAllElement()
            {
                foreach (var item in WorkOrders)
                {
                    item.IsSelected = true;
                }
                return true;
            }

public bool CanSelectAll
        {
            get { return true; }
        }

        public List<string> WorkOrdersList
        {
            get { return _workOrdersList; }
        }

        private ObservableCollection<WorkOrder> _workOrders = new ObservableCollection<WorkOrder>();
        public ObservableCollection<WorkOrder> WorkOrders
        {
            get
            {
                int progr = 1;
                foreach (var item in WorkOrdersList)
                {
                    if (_workOrders.FirstOrDefault(i => i.ID_WORK_ORDER == item) == null)
                    {
                        _workOrders.Add(new WorkOrder { CD_WORK_ORDER = progr, ID_WORK_ORDER = item, IsSelected = false });
                        progr++;
                    }
                }
                return _workOrders;
            }
        }
    }

【问题讨论】:

  • 你有没有试过给命令一个相对的源来查看模型,即 control.dataContext ?

标签: c# wpf mvvm checkbox


【解决方案1】:
<CheckBox IsChecked="{Binding DataContext.SelectAll, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />

为我工作。

【讨论】:

  • 这适用于 IsChecked,也应该适用于命令,一旦你改变,请告诉我?
  • 这应该适用于命令.. ''
  • 我会留下 UserControl 的答案,因为在大多数情况下,我们处理的是 userControls 而不是 windows。无论如何感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 2016-08-21
  • 2018-06-05
  • 1970-01-01
相关资源
最近更新 更多