我有一個用綠色矩形填充的 ScrollViewer,每次更改時我都需要在 TextBlock 上報告其滾動值(或百分比)。我還需要能夠通過更改它系結到的屬性來更改滾動值。
我創建了一個 Attached 屬性ScrollViewerBehavior,它為我提供了我需要的值,并將其系結到我的 viewmodel ( ScrollValue) 的一個屬性,但是由于從未到達 setter,因此該值不會更新。視圖模型與視圖正確鏈接。
這是我的代碼:
查看
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="6*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0" Background="Gray" local:ScrollViewerBehavior.ScrollState="{Binding ScrollValue, Mode=TwoWay}" >
<StackPanel>
<Rectangle Width="50" Height="50" Fill="Green" Margin="5" />
<Rectangle Width="50" Height="50" Fill="Green" Margin="5" />
<Rectangle Width="50" Height="50" Fill="Green" Margin="5" />
<Rectangle Width="50" Height="50" Fill="Green" Margin="5" />
<Rectangle Width="50" Height="50" Fill="Green" Margin="5" />
</StackPanel>
</ScrollViewer>
<TextBlock Grid.Row="1" Text="{Binding ScrollValue}" />
</Grid>
視圖模型
public class MainViewModel : BaseViewModel
{
private double _scrollValue = 0;
public double ScrollValue
{
get { return _scrollValue; }
set
{
// This code is never reached
_scrollValue = value;
OnPropertyChanged("ScrollValue");
}
}
}
滾動查看器行為
public static double GetScrollState(DependencyObject obj)
{
return (double)obj.GetValue(ScrollStateProperty);
}
public static void SetScrollState(DependencyObject obj, double value)
{
obj.SetValue(ScrollStateProperty, value);
}
public static readonly DependencyProperty ScrollStateProperty =
DependencyProperty.RegisterAttached("ScrollState", typeof(double), typeof(ScrollViewerBehavior), new PropertyMetadata(0.5, (o, e) =>
{
var scrollViewer = o as ScrollViewer;
if (scrollViewer == null)
{
return;
}
else
{
double newVO = (double)e.NewValue * scrollViewer.ScrollableHeight;
scrollViewer.ScrollToVerticalOffset(newVO);
SetScrollState(o, newVO);
}
}));
我看不到我錯過了什么
uj5u.com熱心網友回復:
我在代碼中沒有看到您正在更改ScrollValue. 由于您的附加屬性與此系結,因此它僅ScrollValue在您的視圖模型更新時更新。除非我誤解了您的解釋,否則您希望在ScrollValue每次滾動條值更改時進行更新。為此,您可以掛鉤ScrollChanged事件:
(我只更新了您的代碼,只顯示需要的內容)
public static readonly DependencyProperty ScrollStateProperty =
DependencyProperty.RegisterAttached("ScrollState", typeof(double), typeof(ScrollViewerBehavior), new PropertyMetadata(0.5, (o, e) =>
{
if (o is ScrollViewer scrollViewer)
{
scrollViewer.ScrollChanged = OnScrollChanged;
}
}));
private static void OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (sender is ScrollViewer scrollViewer)
{
SetScrollState(scrollViewer, scrollViewer.VerticalOffset);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/344151.html
