【问题标题】:select all checkbox in datagrid header not working properly in wpf mvvm选中数据网格标题中的所有复选框在 wpf mvvm 中无法正常工作
【发布时间】:2016-05-05 06:06:10
【问题描述】:

This is what i want我正在研究 wpf mvvm 数据网格并尝试将全选复选框与视图模型绑定。它没有给我正确的结果。我在这里提供我的代码详细信息(xaml 代码和视图模型代码)

 <DataGrid Grid.Row="0" ItemsSource="{Binding Path=UsecaseListItems}" AutoGenerateColumns="False" Name="MyDataGrid"
          CanUserAddRows="False" >
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding IsSelected}" Width="50" >
                <DataGridCheckBoxColumn.HeaderTemplate>
                    <DataTemplate x:Name="dtAllChkBx">
                        <CheckBox Name="cbxAll" Content="All" IsChecked="{Binding Path=DataContext.AllSelected,RelativeSource={RelativeSource AncestorType=DataGrid},Mode=TwoWay}"/>
                    </DataTemplate>
                </DataGridCheckBoxColumn.HeaderTemplate>
            </DataGridCheckBoxColumn>
            <DataGridTemplateColumn Header="Name" Width="SizeToCells" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding UsecaseName}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>


private bool _IsSelected;
    public bool IsSelected
    {
        get { return _IsSelected; }
        set
        {
            _IsSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }

    private bool _AllSelected;
    public bool AllSelected
    {
        get { return _AllSelected; }
        set
        {
            _AllSelected = value;
            foreach (var reportListItemModel in UsecaseListItems)
            {
                reportListItemModel.IsSelected = this._AllSelected;
            }
            OnPropertyChanged("IsSelected");

        }
    }


    private ObservableCollection<UseCase> _usecaseListItems = new ObservableCollection<UseCase>();
    public ObservableCollection<UseCase> UsecaseListItems
    {
        get { return _usecaseListItems; }
        set {
            _usecaseListItems = value;
            OnPropertyChanged("UsecaseListItems");
        }
    }

【问题讨论】:

  • 您的代码似乎有误。为什么要将它绑定到视图模型?为什么不尝试将复选框绑定到标题复选框isChecked?

标签: wpf xaml mvvm datagrid


【解决方案1】:

同样的问题,我有...

RelativeSource={RelativeSource AncestorType=DataGrid}

没有用,所以我尝试了......

RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}

...它成功了。

【讨论】:

    【解决方案2】:

    由于视图模型中的 allselected 属性,您必须将祖先类型赋予窗口或用户控件而不是数据网格...

    【讨论】:

    • 主要问题是当我检查它时,只有一半的列表(位于滚动条的下方)被选中,然后我再次向上滚动,其余的复选框是检查。
    • 我用了 updatesourcetrigger=true 但还是不行
    • 检查触发事件 OnPropertyChanged("IsSelected");而不是这个给 OnPropertyChanged("AllSelected");.. 也给祖先类型到窗口或用户控制它可能是什么......
    【解决方案3】:

    检查触发事件OnPropertyChanged("IsSelected");。不要使用这个,而是给OnPropertyChanged("AllSelected");。还将祖先类型赋予窗口或用户控制它可能是什么......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2015-08-12
      相关资源
      最近更新 更多