附加属性没有更新它绑定到(MVVM)的值



我有一个ScrollViewer充满绿色矩形,我需要报告它的滚动值(或百分比)在一个TextBlock每次它的变化。我还需要能够通过改变它绑定的属性来改变滚动值。

我已经创建了一个附加属性ScrollViewerBehavior,它给了我需要的值,并且我将它绑定到我的视图模型(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>


ViewModel

public class MainViewModel : BaseViewModel
{
private double _scrollValue = 0;
public double ScrollValue
{
get { return _scrollValue; }
set
{
// This code is never reached 
_scrollValue = value;
OnPropertyChanged("ScrollValue");
}
}
}


ScrollViewerBehavior

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);
}
}));

我看不出我错过了什么

我没有看到在代码的任何地方,你正在改变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);
}
}

最新更新