2010-06-07 45 views
0

我創建了一個簡單的scrollviewer(pnlDayScroller),並希望有一個單獨的水平滾動條(相關的滾動條)來執行水平滾動。所有與下面的代碼接受我需要綁定相關聯的滾動條的可見性。Wpf綁定到一個函數

我不能簡單地將它綁定到滾動查看器的水平模板部分的可見性屬性,因爲我已將其設置爲始終隱藏。我能想到的唯一辦法做,這是相關聯的滾動的可見性結合到這樣的功能

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 

而問題已解決。

+0

正在關注JustABill的評論我已在上面添加了一些跟進 – user360349 2010-06-07 16:46:55

回答

0

您需要一個ValueConverter。綁定到scrollableWidth屬性,並將ValueConverter添加到綁定的Converter屬性中。這個例子在C#中,但這個概念非常簡單,我相信如果你看,有VB.Net的例子。

,你需要做的簡單形式爲:

  1. 創建一個實現的IValueConverter(我認爲這是在System.ComponentModel)一個新的類。
  2. 用第一個代碼塊填充Convert方法,除了使用「value」參數代替scrollableWidth並返回可見性。
  3. 爲您的本地課程添加合適的xmlns。
  4. 將新的ValueConverter的StaticResource添加到您的Window/UserControl/whatever。
  5. 使用此ValueConverter將Visibility屬性綁定到scrollableWidth屬性。