2011-09-22 12 views
6

Tengo más de 20 casillas de verificación en mi formulario wpf. Necesito almacenar los valores IsChecked de todos ellos en algún objeto.Encuadernación de casillas de verificación: ¿cuál es la mejor solución?

Sé de dos maneras.

1) se unen todas las casillas de propiedades en objeto correspondiente usando propiedad de dependencia como here

2) manejar Clicked caso de todos ellos

Qué solución es mejor? ¿Hay una solución mejor que ocupe menos espacio en el código subyacente?

Respuesta

3

Definitivamente el uso de una unión

Si las casillas de verificación no están relacionados y son por todo el lugar, tendrá 20 propiedades de dependencia diferentes que se unen a en su DataContext o modelo de vista

Si sus casillas están todos juntos , tal como aparece uno tras otro o en una cuadrícula, puede ponerlos en una colección y se unen a ellos un ItemsControl

<ItemsControl ItemsSource="{Binding Options}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding Description}" 
         IsChecked="{Binding IsChecked}" /> 
     </DataTemplate> 
    </ItemsControl> 
</ItemsControl> 

Su modelo de vista o DataContext contendría algo como esto:

private List<Option> options; 

private List<Option> Options 
{ 
    get 
    { 
     if (options== null) 
     { 
      options = new List<Option>(); 

      // Load Options - For example: 
      options.Add(new Option { Description = "Option A", IsChecked = false }); 
      options.Add(new Option { Description = "Option B" }); 
      options.Add(new Option { Description = "Option C", IsChecked = true}); 
     } 
     return options; 
    } 
} 

Y tu clase Option sería simplemente

public class Option 
{ 
    public string Description { get; set; } 
    public bool IsChecked { get; set; } 
} 
+0

+1 - aunque prefiero usar IsSelected; IsChecked implica que el objeto siempre estará vinculado a una casilla de verificación (o similar). –

1

para almacenar el estado IsChecked sugeriría a seguir la primera (using binding), es mejor porque la unión permite mantener la interfaz de usuario y el código detrás más limpio y desacoplado. El segundo (handling an event) es más parecido al enfoque de WinForms, así que no veo por qué debería seguirlo en la aplicación WPF.

EDIT: Respuesta a la pregunta con respecto a varias propiedades

Si depende de lo que en realidad está ligada a una vista y cómo casillas de verificación se colocan en la vista. Si está utilizando alguna ItemsControl contenedor como ListView y cada casilla de verificación pertenecen a la fila/columna de un solo - puede enlazar todas las casillas a una sola colección como

private IList<bool> states; 
public IList<bool> States 
{ 
    get 
    { 
     return this.states; 
    } 

    set 
    { 
     this.states = value; 
     this.OnPropertyChanged("States"); 
    } 
} 

Para darle una respuesta concreta - Compartir favor diseño de interfaz de usuario del formulario donde se colocan las casillas de verificación.

+0

Yay, tratan de explicar mejor por favor, mi Inglés no es lo suficientemente bueno. ¿Qué número es mejor? –

+0

@Andrew: vea la respuesta actualizada, básicamente la primera - 1, segunda - 2 :). Desde mi punto de vista enlace mucho mejor solo para almacenar valores – sll

+0

La misma pregunta que he publicado en David Basarab respuesta ... –

2

Encuadernación.

La razón es simple. Si decidió conectarse al evento IsChecked, debería tener código adicional para averiguar qué propiedad a qué casilla de verificación.

Peor caso es que tiene un método para cada uno.

Con el encuadernado una vez que lo configura en la casilla de verificación que ha terminado. Todo lo que tienes que hacer es guardar el objeto al final.

+0

Aún así, habrá alrededor de 20 propiedades de dependencia en código subyacente, ¿verdad? Una propiedad por casilla de verificación. –

+0

@Andrew Sí, aunque si sus CheckBoxes están todos en la misma área, podría hacer una lista de objetos que contengan 'Description' y' IsChecked', y vincularlos a 'ItemsControl'. – Rachel

+0

Pero realmente no necesita lidiar con las propiedades de dependencia. Podría tener un caso en el que use el mismo evento de clic para todos los 20 y luego actualice una matriz de objetos pero aún así requeriría lógica para determinar qué casilla de verificación denominó el evento. Pero si tiene una matriz de objetos probablemente ya esté usando algo como un ListBox para los objetos. – Paparazzi

2

Si utiliza un buen marco de MVVM puede usar el enlace sin tener que hacerlo a mano (solo asómbrelas a alguna convención) - Me gusta Caliburn Micro pero hay muchas buenas por ahí.

Cuestiones relacionadas