Перенаправление свойства зависимости в шаблон - PullRequest
0 голосов
/ 08 января 2020

Мне нужно управлять смещением горизонтальной и вертикальной прокрутки 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...