2015-12-22 5 views
0

Я пытаюсь синхронизировать прокрутку между двумя datagrids, так что каждый прокрутка зеркалируется между ними (горизонтальная или вертикальная прокрутка), после того, как я начал выполнять мой метод, но установщик вызов из моего стиля прокрутки никогда не вызывает объект зависимости, чтобы установить значение.Зависимость Свойство не установлено из стиля

Это моя сетка данных.

<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 тем, что стиль установлен правильно с двумя сеттерами и даже установщиком для точки ScrollSynchronizer на правильный объект.

Я просто в недоумении, почему это не задано.

ответ

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

Заметим также, что параметр DependencyObject из PropertyChangedCallback имеет тип ScrollBar когда вы устанавливаете свойство в ScrollBar стиле.

+0

Yup, полностью пропустил это. Я думал, что что-то пропустил, создав «DependencyProperty». Спасибо. –