Мне нужно управлять смещением горизонтальной и вертикальной прокрутки TreeView
. Для этого я реализовал элемент управления TreeViewEx
и пользовательский шаблон для этого элемента управления (фактически это в основном исходный шаблон для дерева).
В этом элементе управления я переопределил OnApplyTemplate
для захвата ScrollViewer
внутри шаблона, так что я могу получить доступ к его свойствам HorizontalOffset и VerticalOffset. Наконец, я показал их через обычные свойства TreeViewEx, чтобы я мог установить их из кода.
Теперь я хотел бы, чтобы оба эти свойства были DependencyProperty
. Проблема в том, как я могу прозрачно перенести значения в ScrollViewer и обратно.
Моя идея заключалась в том, чтобы добавить ручные двусторонние привязки к свойствам ScrollViewer, чтобы я мог также добавить привязки к своим свойствам. Код выглядит следующим образом:
public class TreeViewEx : TreeView
{
private ScrollViewer scrollViewer;
private void AttachBindings(ScrollViewer scrollViewer)
{
Binding hBinding = new Binding("HorizontalScrollOffset");
hBinding.Source = this;
hBinding.Mode = BindingMode.TwoWay;
scrollViewer.SetBinding(ScrollViewer.HorizontalOffsetProperty, hBinding);
Binding vBinding = new Binding("VerticalScrollOffset");
vBinding.Source = this;
vBinding.Mode = BindingMode.TwoWay;
scrollViewer.SetBinding(ScrollViewer.VerticalOffsetProperty, vBinding);
}
private void DetachBindings(ScrollViewer scrollViewer)
{
BindingOperations.ClearBinding(scrollViewer, ScrollViewer.HorizontalOffsetProperty);
BindingOperations.ClearBinding(scrollViewer, ScrollViewer.VerticalOffsetProperty);
}
public override void OnApplyTemplate()
{
if (scrollViewer != null)
DetachBindings(scrollViewer);
scrollViewer = this.Template.FindName("PART_Scroll", this) as ScrollViewer;
if (scrollViewer != null)
AttachBindings(scrollViewer);
base.OnApplyTemplate();
}
// Snip default implementations of DP's
}
Однако существует проблема - невозможно привязать данные к ScrollViewer.HorizontalOffsetProperty
. Я мог бы прикрепить привязку к своим свойствам, но тогда, если кто-то связался с ними, он очистил бы мою внутреннюю привязку, и она больше не работала.
Как я могу создать "свойства зависимости транспорта" из моего элемента управления к шаблону ScrollViewer
?