创建AttachedProperty以保存滚动条标记的位置

我为DataGrid创建了一个略微自定义的垂直滚动条。 在其中我添加了一个ItemsControl来保存所选项目的位置。 到目前为止,这是一个带有硬编码标记的模型。 在此处输入图像描述

下面是我自定义的垂直滚动条模板,其中ItemsControl放置有硬编码标记值。

                                           30 70 120 170                     

我接下来要做的是创建一个AttachedProperty来保持标记位置并将其绑定回ItemsControl。

我真的不明白的是:
– 这个附加属性Type应该是什么,int的ObservableCollection?
– 由于这是DataGrid中所选项目总数的指南,标记的位置是否需要以某种方式缩放?
– 我有一个捕获DataGrid.SelectionChanged的附加行为,但是如果主集合发生变化,那么它似乎不是一个事件呢?

[编辑]

直接绑定到DataGrids SelectedItems。 (但是当选择某些内容时,ItemsControl顶部会出现闪烁)
– 删除或注释掉SelectionChanged行为。
– 将ItemSource更改为:

 ItemsSource="{Binding ElementName=GenericDataGrid, Path=SelectedItems}" 

– 将Multibinding更改为:

       

– 最后转换为:

 public class MarkerPositionConverter: IMultiValueConverter { //Performs the index to translate conversion public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { //calculated the transform values based on the following object o = (object)values[0]; DataGrid dg = (DataGrid)values[1]; double itemIndex = dg.Items.IndexOf(o); double trackHeight = (double)values[2]; int itemCount = (int)values[3]; double translateDelta = trackHeight / itemCount; return itemIndex * translateDelta; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } 

我试图达到你想要的结果

所以我做了一些改变,我评论了我做了哪些更改

将此转换器引用添加到资源

   

项目控制显示标记的xaml

                             

behavior.cs

 public class DataGridBehaviors : Behavior { ... void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { MyClass.Instance.SelectedMarkers.Clear(); //updated item count MyClass.Instance.ItemCount = this.AssociatedObject.Items.Count; foreach (object o in this.AssociatedObject.SelectedItems) MyClass.Instance.SelectedMarkers.Add(this.AssociatedObject.Items.IndexOf(o)); } } //removed ItemsControlBeahviors public class MyClass : INotifyPropertyChanged { ... //added item count property public int ItemCount { get; set; } ... } //added class to perform the index to translate conversion public class MarkerPositionConverter: IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { //calculated the transform values based on the following double itemIndex = (double)values[0]; double trackHeight = (double)values[1]; double translateDelta = trackHeight / MyClass.Instance.ItemCount; return itemIndex * translateDelta; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } 

现在您可以根据自己的需要进行自定义

消除闪烁

闪烁是由于矩形的初始位置,并且在绑定获取其所有值之前,以避免这种初始间歇性闪烁使用此

         

因此,当任何绑定属性忙于解析值或没有任何值时,我将矩形推回视图,将其推回1000 px。

和项目面板模板(可选)

      

由于默认情况下canvas不剪切其子画面,因此将ClipToBounds设置为true是安全的。 即使在使用巨大的后备值之后,当UI中的某个位置仍然可以看到闪烁时,这是必要的。