tengo una vista XAML con un cuadro de lista:desplazamiento WPF ListBox al SelectedItem establecido en el código en un modelo de vista
<control:ListBoxScroll ItemSource="{Binding Path=FooCollection}"
SelectedItem="{Binding SelectedFoo, Mode=TwoWay}"
ScrollSelectedItem="{Binding SelectedFoo}">
<!-- data templates, etc. -->
</control:ListBoxScroll>
El elemento seleccionado está ligado a una propiedad, en mi opinión. Cuando el usuario selecciona un elemento en el cuadro de lista, mi propiedad SelectedFoo en el modelo de vista se actualiza. Cuando configuro la propiedad SelectedFoo en mi modelo de vista, se selecciona el elemento correcto en el cuadro de lista.
El problema es que si el SelectedFoo que está configurado en el código no está visible en este momento, debo llamar al ScrollIntoView
en el cuadro de lista. Como mi ListBox está dentro de una vista y mi lógica está dentro de mi modelo de vista ... No pude encontrar una manera conveniente de hacerlo. Así que me ampliado ListBoxScroll:
class ListBoxScroll : ListBox
{
public static readonly DependencyProperty ScrollSelectedItemProperty = DependencyProperty.Register(
"ScrollSelectedItem",
typeof(object),
typeof(ListBoxScroll),
new FrameworkPropertyMetadata(
null,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(onScrollSelectedChanged)));
public object ScrollSelectedItem
{
get { return (object)GetValue(ScrollSelectedItemProperty); }
set { SetValue(ScrollSelectedItemProperty, value); }
}
private static void onScrollSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var listbox = d as ListBoxScroll;
listbox.ScrollIntoView(e.NewValue);
}
}
Básicamente expone una nueva propiedad de dependencia ScrollSelectedItem
la que se unen a la propiedad SelectedFoo
en mi modelo de vista. Luego engancho en la devolución de llamada cambiada de la propiedad dependiente y despliego el elemento recién seleccionado en la vista.
¿Alguien más sabe de una forma más fácil de llamar a funciones en controles de usuario en una vista XAML respaldada por un modelo de vista? Es un poco de una carrera en torno a:
- crear una propiedad dependiente
- añadir una devolución de la propiedad cambió de devolución de llamada
- función mango invocación dentro de la devolución de llamada estática
Sería bueno para poner la lógica en el método ScrollSelectedItem { set {
pero el marco de dependencia parece escabullirse y se las arregla para funcionar sin llamarlo realmente.
Será mucho más fácil establecer 'SelectedIndex'. –
Parece una "preocupación" de Vista en lugar de una ViewModel. Tuve que hacer algo similar, pero dejé el código en la vista. Ver http://matthamilton.net/focus-a-virtualized-listboxitem –
@MattHamilton - este código está técnicamente en la Vista (dentro de un control). ¿Qué código escribirías en una vista (en cualquier lugar) que lograría llamar a ScrollIntoView? Tenga en cuenta que no puedo anular el conjunto en SelectedItem ya que no es virtual. –