У меня есть представление 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 {
, но структура зависимостей, похоже, подкралась и умудряется работать, фактически не вызывая ее.