用于WPF DataGrid的ScrollIntoView(MVVM)

我正在使用MVVM模式,我在XAML中为DataGrid的SelectedItem创建了一个绑定。 我以编程方式设置SelectedItem,但是当我这样做时,DataGrid不会滚动到选择。 有没有办法在不完全打破MVVM模式的情况下实现这一目标?

我找到了以下解决方案但是当我尝试实现Behavior类时出现错误,即使我已经安装了Blend SDK: http : //www.codeproject.com/Tips/125583/ScrollIntoView-for-a havenGrid-当-使用,MVVM

这应该工作。 我们的想法是,您将附加到DataGrid附加属性。 在附加它的xaml中,您将它绑定到ViewModel上的属性。 每当您想以编程方式为SelectedItem分配值时,您还要为此属性设置一个值,附加属性绑定到该属性。

我已经将附加的属性类型设置为SelectedItem类型的任何类型,但老实说,只要将它设置为与之前不同的类型,它就不重要。 此附加属性仅用作以MVVM友好方式在视图控件(在本例中为DataGrid )上执行某些代码的方法。

所以,这就是说,这是附加属性的代码:

 namespace MyAttachedProperties { public class SelectingItemAttachedProperty { public static readonly DependencyProperty SelectingItemProperty = DependencyProperty.RegisterAttached( "SelectingItem", typeof(MySelectionType), typeof(SelectingItemAttachedProperty), new PropertyMetadata(default(MySelectionType), OnSelectingItemChanged)); public static MySelectionType GetSelectingItem(DependencyObject target) { return (MySelectionType)target.GetValue(SelectingItemProperty); } public static void SetSelectingItem(DependencyObject target, MySelectionType value) { target.SetValue(SelectingItemProperty, value); } static void OnSelectingItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var grid = sender as DataGrid; if (grid == null || grid.SelectedItem == null) return; // Works with .Net 4.5 grid.Dispatcher.InvokeAsync(() => { grid.UpdateLayout(); grid.ScrollIntoView(grid.SelectedItem, null); }); // Works with .Net 4.0 grid.Dispatcher.BeginInvoke((Action)(() => { grid.UpdateLayout(); grid.ScrollIntoView(grid.SelectedItem, null); })); } } } 

这是xaml片段:

  ...  ...   

我是MVVM的新手。 我理解MVVM的想法,并尝试正确实现一切。 我上面遇到了类似的问题,我最终在XAML中输入了1行,后面的代码中有1行。 其余代码在VM中。 我在XAML中做了以下事情

  

这在后面的代码中:

 private void Selection1List_SelectionChanged(object sender, SelectionChangedEventArgs e) { Selection1List.ScrollIntoView(Selection1List.SelectedItem); } 

这很好用。

我知道有些人甚至不想在窗口后面的代码中使用一行代码。 但我认为这一行只是为了观点。 它与数据或数据逻辑无关。 所以我认为这不违反MVVM原则 – 而且更容易实现。

欢迎任何评论。