WPF Установите / снимите все флажки, расположенные в сетке - PullRequest
0 голосов
/ 25 марта 2010

У меня есть сетка с некоторыми столбцами. Одним из этих столбцов является флажок типа. Затем в моем интерфейсе есть две кнопки: одна для проверки всех и другая для отмены всех. Я хотел бы отметить все флажки в столбце при нажатии кнопки и снять все флажки при нажатии другого. Как я могу это сделать?

Некоторые фрагменты кода:
<...>

                    <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();            
    }

Спасибо!

1 Ответ

3 голосов
/ 25 марта 2010

Вам не нужно ставить / снимать все флажки. Вы просто устанавливаете свойство, к которому привязаны флажки, а затем флажки будут сняты. Однако вам необходимо реализовать 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 (в коде), пользовательский интерфейс будет обновляться, а ваши флажки будут проверять / снимать флажок

вам не нужно это делать

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