【问题标题】:Dependency Property not set from style未从样式设置依赖属性
【发布时间】:2016-03-28 13:41:18
【问题描述】:

我正在尝试在两个数据网格之间同步滚动,以便每个滚动都在它们之间镜像(水平或垂直滚动​​),在谷歌搜索如何做之后,我开始实现我的方法,但我的滚动条样式中的 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 方法中放置了一个断点,即PropertyChangedCallbackDependencyProperty,但由于某种原因,这从未被命中。

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

我只是不知道为什么没有设置它。

【问题讨论】:

    标签: c# wpf xaml dependency-properties dependencyobject


    【解决方案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

    【讨论】:

    • 是的,完全错过了。我以为我在设置DependencyProperty 时遗漏了一些东西。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2012-06-01
    相关资源
    最近更新 更多