0

我有一个带有一些列的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();

一切正常,但现在我想在按下一个或另一个按钮时选中/取消选中 gridview 列中的所有复选框。我怎样才能做到这一点?

像这样的东西¿?我收到一条错误消息,提示我可以修改 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();            
    }

谢谢!

4

1 回答 1

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(); 
于 2010-03-24T22:35:48.577 回答