23

私は MVVM パターンを使用しており、DataGrid の SelectedItem のバインディングを XAML で作成しました。プログラムで SelectedItem を設定しますが、そうすると、DataGrid は選択範囲までスクロールしません。MVVMパターンを完全に壊さずにこれを達成する方法はありますか?

Behavior次の解決策を見つけましたが、 Blend SDK をインストールしたにもかかわらず、クラスを実装しようとするとエラーが発生します: http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when -使用-MVVM

4

4 に答える 4

38

これはうまくいくはずです。アイデアは、に添付するこの添付プロパティがあるということです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>
于 2013-08-03T03:04:18.740 に答える