依赖属性未从样式设置

时间:2015-12-22 10:14:24

标签: c# wpf xaml dependency-properties dependencyobject

我正在尝试同步两个数据网格之间的滚动,以便每个滚动在它们之间进行镜像(水平或垂直滚动​​),在谷歌搜索后如何开始实现我的方法但是我的滚动条样式的setter调用从不调用依赖项对象来设置值。

这是我的数据网格。

<dataGridEx:DataGridEx ColumnHeaders="{Binding SystemMonitorValues.ColumnHeaders}"
                       ItemsSource="{Binding SystemMonitorValues.Rows}"
                       Style="{StaticResource DataGridStyle}"
                       ScrollViewer.CanContentScroll="True"
                       ScrollViewer.VerticalScrollBarVisibility="Auto"
                       ScrollViewer.HorizontalScrollBarVisibility="Auto">
    <dataGridEx:DataGridEx.Resources>
        <Style TargetType="{x:Type ScrollBar}">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="scroll:ScrollSynchronizer.ScrollGroup" Value="Group1" />
        </Style>
    </dataGridEx:DataGridEx.Resources>
</dataGridEx:DataGridEx>

因此,在滚动条样式中,我尝试将ScrollSynchronizer.ScrollGroup设置为值为“Group1”。

我的ScrollSynchronizer设置如下:

public class ScrollSynchronizer : DependencyObject
{
    public static readonly DependencyProperty ScrollGroupProperty = DependencyProperty.Register(@"ScrollGroup",
            typeof(string), typeof(ScrollSynchronizer), new PropertyMetadata(new PropertyChangedCallback(OnScrollGroupChanged)));

static ScrollSynchronizer()
{
}

public string ScrollGroup
{
    get
    {
        return (string)this.GetValue(ScrollGroupProperty);
    }

    set
    {
        this.SetValue(ScrollGroupProperty, value);
    }
}

private static void OnScrollGroupChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var scrollViewer = d as System.Windows.Controls.ScrollViewer;

    ...
}

我在OnScrollGroupChanged方法中放置一个断点,PropertyChangedCallback DependencyProperty,但由于某种原因,它永远不会被击中。

我知道样式正在工作,因为滚动条的背景设置为Red,但ScrollGroup的设置器似乎不想被调用,这也在Snoop中显示使用两个setter正确设置Style,甚至将ScrollSynchronizer点的setter设置为正确的对象。

我只是不知道为什么没有这样做。

1 个答案:

答案 0 :(得分:1)

ScrollSynchronizer.ScrollGroup应该是attached property而不是常规依赖属性:

public static class ScrollSynchronizer
{
    public static readonly DependencyProperty ScrollGroupProperty =
        DependencyProperty.RegisterAttached(
            "ScrollGroup", typeof(string), typeof(ScrollSynchronizer),
            new PropertyMetadata(OnScrollGroupChanged));

    public static string GetScrollGroup(DependencyObject obj)
    {
        return (string)obj.GetValue(ScrollGroupProperty);
    }

    public static void SetScrollGroup(DependencyObject obj, string value)
    {
        obj.SetValue(ScrollGroupProperty, value);
    }

    private static void OnScrollGroupChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var scrollBar = d as ScrollBar;
        ...
    }
}

另请注意,当您在ScrollBar样式中设置属性时,PropertyChangedCallback的DependencyObject参数的类型为ScrollBar