これはうまくいくはずです。アイデアは、に添付するこの添付プロパティがあるということですDataGrid
。アタッチする xaml で、.xml のプロパティにバインドしますViewModel
。プログラムで に値を割り当てる場合は常にSelectedItem
、添付プロパティがバインドされているこのプロパティにも値を設定します。
添付プロパティの型SelectedItem
は何にでもなるようにしましたが、正直なところ、以前とは違うものに設定している限り、型が何であっても問題ありません。DataGrid
この添付プロパティは、MVVM に適した方法でビュー コントロール (この場合は a) でコードを実行する手段として使用されています。
つまり、添付プロパティのコードは次のとおりです。
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>