У меня есть представление XAML со списком:
<control:ListBoxScroll ItemSource="{Binding Path=FooCollection}"
SelectedItem="{Binding SelectedFoo, Mode=TwoWay}"
ScrollSelectedItem="{Binding SelectedFoo}">
<!-- data templates, etc. -->
</control:ListBoxScroll>
Выбранный элемент привязан к свойству в моем представлении. Когда пользователь выбирает элемент в списке, меняет свойство SelectedFoo в модели представления. Когда я устанавливаю свойство SelectedFoo в моей модели просмотра, в поле списка выбирается правильный элемент.
Проблема в том, что если SelectedFoo, установленный в коде, в настоящее время не отображается, мне нужно дополнительно вызвать ScrollIntoView
в списке. Поскольку мой ListBox находится внутри представления, и моя логика находится внутри моей модели представления... Я не мог найти удобный способ сделать это. Поэтому я расширил 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);
}
}
Он в основном предоставляет новое свойство зависимостей ScrollSelectedItem
, которое я привязываю к свойству SelectedFoo
в моей модели представления. Затем я перехватываю свойство измененного обратного вызова зависимого свойства и прокручиваю вновь выбранный элемент в виде.
Кто-нибудь еще знает о более удобном способе вызова функций на пользовательских элементах управления в представлении XAML, которое поддерживается моделью просмотра? Это немного бегать, чтобы:
- создать зависимое свойство
- добавить обратный вызов свойства измененного обратного вызова
- вызов функции обработки внутри статического обратного вызова
Было бы неплохо поставить логику в методе ScrollSelectedItem { set {
, но структура зависимостей, похоже, прокралась и справилась с работой, фактически не называя ее.