Ответ 1
Это должно сработать. Идея заключается в том, что у вас есть это прикрепленное свойство, которое вы присоедините к DataGrid
. В xaml, где вы его прикрепляете, вы привяжете его к свойству на ViewModel
. Всякий раз, когда вы хотите программно присвоить значение SelectedItem
, вы также устанавливаете значение для этого свойства, к которому привязано связанное свойство.
Я сделал тип прикрепленного типа таким, какой бы тип SelectedItem
не был, но, честно говоря, не имеет значения, какой тип до тех пор, пока вы установите его на нечто иное, чем то, что было раньше. Это прикрепленное свойство просто используется как средство для выполнения некоторого кода в элементе управления представлением (в данном случае a DataGrid
) в режиме MVVM.
Итак, вот здесь код для прикрепленного свойства:
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:
<Window ...
xmlns:attachedProperties="clr-namespace:MyAttachedProperties">
...
<DataGrid
attachedProperties:SelectingItemAttachedProperty.SelectingItem="{Binding MyViewModel.SelectingItem}">
...
</DataGrid>
</Grid>