WPF选中/取消选中gridview中的所有复选框

时间:2010-03-24 21:10:14

标签: wpf gridviewcolumn uncheck

我有一些包含某些列的gridview。其中一列是复选框类型。然后我的UI中有两个按钮,一个用于全部检查,另一个用于取消全部检查。当我按下a按钮时,我想检查列中的所有复选框,当我按下另一个时,取消选中所有复选框。我怎么能这样做?

一些代码段:                                                                                
                                                                               < ...>

                    <Classes:SortableListView 
                            x:Name="lstViewRutas"                                      
                            ItemsSource="{Binding Source={StaticResource 
                                          RutasCollectionData}}" ... >
                     <...>
                    <GridViewColumn Header="Activa" Width="50">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox  x:Name="chkBxF"  
                                           Click="chkBx_Click"
                                           IsChecked="{Binding Path=Activa}"    
                                           HorizontalContentAlignment="Stretch" 
                                           HorizontalAlignment="Stretch"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <...>
                    </Classes:SortableListView>

                    <...>
                    </Page>

我绑定到gridview的数据对象是:

   namespace GParts.Classes
   {
   public class RutasCollection
   {

    /// <summary>
    /// Colección de datos de la tabla
    /// </summary>
    ObservableCollection<RutasData> _RutasCollection;

    /// <summary>
    /// Constructor. Crea una nueva instancia tipo ObservableCollection
    /// de tipo RutasData
    /// </summary>
    public RutasCollection()
    {               
      _RutasCollection = new ObservableCollection<RutasData>();
    }

    /// <summary>
    /// Retorna el conjunto entero de rutas en la colección
    /// </summary>
    public ObservableCollection<RutasData> Get
    {
        get { return _RutasCollection; }
    }

    /// <summary>
    /// Retorna el conjunto entero de rutas en la colección
    /// </summary>
    /// <returns></returns>
    public ObservableCollection<RutasData> GetCollection()
    {
        return _RutasCollection;
    }

    /// <summary>
    /// Añade un elemento tipo RutasData a la colección
    /// </summary>
    /// <param name="hora"></param>
    public void Add(RutasData ruta)
    { _RutasCollection.Add(ruta); }

    /// <summary>
    /// Elimina un elemento tipo RutasData de la colección
    /// </summary>
    /// <param name="ruta"></param>
    public void Remove(RutasData ruta)
    { _RutasCollection.Remove(ruta); }

    /// <summary>
    /// Elimina todos los registros de la colección
    /// </summary>
    public void RemoveAll()
    { _RutasCollection.Clear(); }

    /// <summary>
    /// Inserta un elemento tipo RutasData a la colección
    /// en la posición rowId establecida
    /// </summary>
    /// <param name="rowId"></param>
    /// <param name="ruta"></param>
    public void Insert(int rowId, RutasData ruta)
    { _RutasCollection.Insert(rowId, ruta);  }     

}

/// <summary>
/// Clase RutasData
/// </summary>
// Registro tabla interficie pantalla
public class RutasData
{
    public int Id { get; set; }
    public bool Activa { get; set; }
    public string Ruta { get; set; }        
}
}

在我的页面加载事件中,我这样做以填充gridview:

        // Obtiene datos tabla Rutas
        var tbl_Rutas = Accessor.GetRutasTable(); // This method returns entire table

        foreach (var ruta in tbl_Rutas)
        {                
            _RutasCollection.Add(new RutasData
            {
                Id = (int) ruta.Id,
                Ruta = ruta.Ruta,
                Activa = (bool) ruta.Activa
            });
        }

        // Enlaza los datos con el objeto proveedor RutasCollection
        lstViewRutas.ItemsSource = _RutasCollection.GetCollection();

一切都还可以,但现在我想在按一个按钮或其他按钮时检查/取消选中gridviewcolumn中的所有复选框。我怎么能这样做?

像这样的东西?我收到一条错误消息,说我可以修改itemsource属性。

    private void btnCheckAll_Click(object sender, RoutedEventArgs e)
    {

        // Update data object bind to gridview
        ObservableCollection<RutasData> listas = _RutasCollection.GetCollection();
        foreach (var lst in listas)
        {                
            ((RutasData)lst).Activa = true;                
        }

        // Update with new values the UI
        lstViewRutas.ItemsSource = _RutasCollection.GetCollection();            
    }

谢谢!

1 个答案:

答案 0 :(得分:3)

您无需选中/取消选中所有复选框。您只需设置复选框绑定的属性,然后选中复选框取消选中。但是,您需要实现INotifyPropertyChanged。这让UI知道底层属性已经改变。

更改以下内容

public class RutasData : INotifyPropertyChanged
{
    public int Id { get; set; }
    private Boolean _activa;

    /// <summary>
    /// Gets and sets the Activa property
    /// </summary>
    public Boolean Activa {
       get { return _activa; }
       set {
          if (_activa == value) { }
          else {
             _activa = value;
             NotifyPropertyChanged("Activa");
          }
       }
    }

    public string Ruta { get; set; }    


    #region INotifyPropertyChanged Members

    /// <summary>
    /// Property Changed event
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Standard NotifyPropertyChanged Method
    /// </summary>
    /// <param name="propertyName">Property Name</param>
    private void NotifyPropertyChanged(string propertyName) {
       if (PropertyChanged != null) {
          PropertyChanged(this,
            new PropertyChangedEventArgs(propertyName));
       }
    }

    #endregion    
}

现在当您设置属性Activa(在代码中)时,UI将更新,您的复选框将选中/取消选中

你不需要这样做

// Update with new values the UI
lstViewRutas.ItemsSource = _RutasCollection.GetCollection();