2010-02-27 10 views
10

Estoy utilizando un CollectionViewSource en un modelo de vista de diálogo que tiene varios requisitos de filtrado, que funciona bien. También mantengo el equivalente del ítem seleccionado en una propiedad (SelectedProject), y me pregunto si podría/debería eliminarlo ya que la View conocerá el ítem actual. Mis datos se ve la unión como:CollectionViewSource CurrentItem

<ListView 
     ItemsSource="{Binding Projects.View}" 
     IsSynchronizedWithCurrentItem="True" 
     SelectedItem="{Binding SelectedProject, Mode=TwoWay}"> 

uso el colocador para el SelectedProject para facilitar la prueba de la unidad, y la CurrentItem no parece ser ajustable por lo que yo puedo ver. También necesito lanzarlo al objeto correcto cuando quiero usarlo. OTOH, if el SelectedProject es redundante, entonces le mostraría el mismo respeto que cualquier otra redundancia y lo eliminaría.

Entonces, ¿cómo se suele tratar con el elemento actual cuando está utilizando un CollectionViewSource?

Respuesta

7

Usted podría eliminar el SelectedProject, pero yo argumentaría en contra. Si tiene la propiedad en su código, está claro lo que está haciendo. Si no lo tiene, tendrá que hacer algo como

CollectionViewSource.GetDefaultView(Projects.View).CurrentItem as Project 

solo para interactuar con el proyecto actual. Valoro la claridad sobre "incorporada". Además de eso, CurrentItem es de solo lectura, por lo que si alguna vez desea seleccionar un elemento en ViewModel, no sería posible.

+1

Puede establecer el elemento actual con varios métodos Mover, pero estoy de acuerdo en que la legibilidad vale la redundancia discutible. Cheers – Berryl

+3

Ese último punto es incorrecto. CollectionView.MoveCurrentTo (elemento de objeto) le permitirá actualizar la selección en el modelo de vista. – Gusdor

1

Debe comprender que SelectedItem de ListView es independiente de ItemsSource. Ya sea que use un CollectionViewSource o una Lista o una Matriz, el ítem seleccionado siempre representará el ítem de esa colección.

Para responder a su pregunta sobre por qué su SelectedProject no se está configurando, le sugiero que verifique la funcionalidad de su setter para detectar errores. Una buena forma de averiguar si el enlace contiene algún error es verificar nuestro Producto en busca de cualquier mensaje de error de enlace durante la depuración.

NOTA: Si su SelectedProject es del mismo tipo que los elementos de su CollectionViewSource de proyectos, no necesita lanzarlo antes del uso (a menos que haya seleccionado SelectedProject of Object type, que también explica su problema de configuración).

EDIT: Lo sentimos, la respuesta corta es no, no es redundante. Tener una variable vinculada al elemento actual no es redundante si tiene las pruebas en mente. Un buen ejemplo es cuando desea probar una versión anterior del SelectedItem con la nueva. Ahora bien, si solo se refiere al CollectionViewSource's SelectedItem, puede ser demasiado tarde para comparar, pero con su propia variable, puede probar la lógica antes de volver a configurarla.

+0

El SelectedProject funciona perfectamente: la pregunta era si era redundante para ColloctionViewSource CurrentItem. – Berryl

1

En mi caso, estaba tratando de establecer el SelectedItem en un ListBox que ItemsSource estaba vinculado a un CollectionViewSource. Es complicado porque realmente se necesita para ajustar el elemento actual en la CollectionViewSource y no ListBox.SelectedItem .... así que creé un método de extensión para manejar esto para el escenario para mí:

YourListBox.SetCurrentItemOnView<YourObjectType>(item); 

... y la definición del método de extensión

public static void SetCurrentItemOnView<T>(this System.Windows.Controls.ListBox listBox, T item) where T : YourObjectType 
{ 
    var view = listBox.ItemsSource as ListCollectionView; 
    if (view == null) { return; } 

    var itemToSelect = (from p in view.SourceCollection.OfType<T>() 
         where p.ID == item.ID 
         select p).FirstOrDefault(); 

    view.MoveCurrentTo(itemToSelect); 
} 

supongo esto fue un problema para mí porque en mi caso la referencia elemento que tenía no era la misma que la referencia del artículo que figura en el ItemsSource, así que tuve que resolver es así

Cuestiones relacionadas