Wpf привязка к функции - PullRequest
0 голосов
/ 07 июня 2010

Я создал простой просмотрщик прокрутки (pnlDayScroller) и хочу иметь отдельную горизонтальную полосу прокрутки (связанный скроллер) для горизонтальной прокрутки. Все работы с приведенным ниже кодом принимают, мне нужно связать видимость связанного скроллера.

Я не могу просто привязать это к свойству видимости горизонтальной части шаблона средства просмотра прокрутки, так как я установил, что это всегда скрыто. Единственный способ сделать это - связать видимость связанного скроллера с такой функцией, что

If associatedScroller.scrollableWidth > 0 then 
    associatedScroller.visibility = visibility.visible
else
    associatedScroller.visibility = visibility.collapsed
end if

Возможно ли это сделать, и если да, то как мне это сделать?

    Private Sub pnlDayScroller_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles pnlDayScroller.Loaded

        Dim binViewport, binMax, binMin, binSChange, binLChange As Binding


        Dim horizontalScrollBar As Primitives.ScrollBar = CType(pnlDayScroller.Template.FindName("PART_HorizontalScrollBar", pnlDayScroller), Primitives.ScrollBar)

        binViewport = New Binding("ViewportSize")
        binViewport.Mode = BindingMode.OneWay
        binViewport.Source = horizontalScrollBar
        associatedScroller.SetBinding(Primitives.ScrollBar.ViewportSizeProperty, binViewport)

        binMax = New Binding("Maximum")
        binMax.Mode = BindingMode.OneWay
        binMax.Source = horizontalScrollBar
        associatedScroller.SetBinding(Primitives.ScrollBar.MaximumProperty, binMax)

        binMin = New Binding("Minimum")
        binMin.Mode = BindingMode.OneWay
        binMin.Source = horizontalScrollBar
        associatedScroller.SetBinding(Primitives.ScrollBar.MinimumProperty, binMin)

        binSChange = New Binding("SmallChange")
        binSChange.Mode = BindingMode.OneWay
        binSChange.Source = horizontalScrollBar
        associatedScroller.SetBinding(Primitives.ScrollBar.SmallChangeProperty, binSChange)

        binLChange = New Binding("LargeChange")
        binLChange.Mode = BindingMode.OneWay
        binLChange.Source = horizontalScrollBar
        associatedScroller.SetBinding(Primitives.ScrollBar.LargeChangeProperty, binLChange)
End Sub

  Private Sub associatedScroller_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.RoutedPropertyChangedEventArgs(Of Double)) Handles associatedScroller.ValueChanged
        pnlDayScroller.ScrollToHorizontalOffset(e.NewValue)
end sub

СЛЕДУЙТЕ ЗА (спасибо JustABill):

Я добавил этот код в подпрограмму pnlDayScroller выше (я обнаружил, что scrollableWidth - это свойство scrollviewer, а не полосы прокрутки, но максимальное свойство дает результат, который я могу использовать вместо этого)

binVisibility = New Binding("Maximum")
    binVisibility.Mode = BindingMode.OneWay
    binVisibility.Source = horizontalScrollBar
    binVisibility.Converter = New ScrollableConverter
    associatedScroller.SetBinding(Primitives.ScrollBar.VisibilityProperty, binVisibility)

и я создал этот класс

 Public Class ScrollableConverter
        Implements IValueConverter

            Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object,
            ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert

            Dim dblMaximum As Double

            If targetType IsNot GetType(Visibility) Then
                Throw New InvalidOperationException("The target must be a visibility")
            Else


                dblMaximum = CType(value, Double)
                Debug.WriteLine("Value of double is " & dblMaximum)

                If dblMaximum > 0 Then
                    Return Visibility.Visible
                Else
                    Return Visibility.Collapsed
                End If
            End If

        End Function

        Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object,
            ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack

            Throw New NotSupportedException()
        End Function

End Class

И проблема решена.

1 Ответ

0 голосов
/ 07 июня 2010

Вам нужен ValueConverter . Привязать к свойству scrollableWidth и добавить свой ValueConverter в свойство Converter привязки. Этот пример на C #, но концепция довольно проста, и я уверен, что есть примеры VB.Net, если вы посмотрите.

Краткая форма того, что вам нужно сделать:

  1. Создайте новый класс, который реализует IValueConverter (я думаю, что это в System.ComponentModel).
  2. Заполните метод Convert первым блоком кода, за исключением того, что вместо scrollableWidth используйте параметр «value» и верните видимость.
  3. Добавьте соответствующий xmlns для ваших локальных классов.
  4. Добавьте StaticResource вашего нового ValueConverter в ваш Window / UserControl / что угодно.
  5. Привязать свойство Visibility к свойству scrollableWidth с помощью этого ValueConverter.
...