依赖项 属性 不是从样式设置的
Dependency Property not set from style
我正在尝试同步两个数据网格之间的滚动,以便每个滚动都在它们之间镜像(水平或垂直滚动),在谷歌搜索如何做之后我开始实施我的方法但是 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
方法中放置了一个断点,它是 DependencyProperty
的 PropertyChangedCallback
但由于某种原因,它永远不会被击中。
我知道样式正在工作,因为滚动条的背景被设置为 Red
但是 ScrollGroup
的 setter 似乎不想被调用,这也显示在 Snoop 中,因为样式已正确设置为两个 setter,甚至 ScrollSynchronizer
指向正确对象的 setter。
我只是不知道为什么没有设置。
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
。
我正在尝试同步两个数据网格之间的滚动,以便每个滚动都在它们之间镜像(水平或垂直滚动),在谷歌搜索如何做之后我开始实施我的方法但是 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
方法中放置了一个断点,它是 DependencyProperty
的 PropertyChangedCallback
但由于某种原因,它永远不会被击中。
我知道样式正在工作,因为滚动条的背景被设置为 Red
但是 ScrollGroup
的 setter 似乎不想被调用,这也显示在 Snoop 中,因为样式已正确设置为两个 setter,甚至 ScrollSynchronizer
指向正确对象的 setter。
我只是不知道为什么没有设置。
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
。