Как установить свойство SelectedItems GridView в WPF с использованием MVVM - PullRequest
2 голосов
/ 23 сентября 2011

У меня есть вид сетки в моем приложении wpf, xaml которого выглядит так:

   <ListView SelectionMode="Extended" ItemsSource="{Binding AllPartTypes}"
      local:DataGridService.SelectedItems="{Binding Path=SelectedPartTypes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <ListView.View>
            <GridView>
                some columns...
            </GridView>
        </ListView.View>
   </ListView>

Вот прикрепленное поведение, которое я использую для получения выбранных элементов:

public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached(
            "SelectedItems",
            typeof(IList),
            typeof(DataGridService),
             new UIPropertyMetadata(new List<object>() as IList, OnSelectedItemsChanged));

        static SelectionChangedEventHandler GetSelectionChangedHandler(DependencyObject obj)
        {
            return (SelectionChangedEventHandler)obj.GetValue(SelectionChangedHandlerProperty);
        }
        static void SetSelectionChangedHandler(DependencyObject obj, SelectionChangedEventHandler value)
        {
            obj.SetValue(SelectionChangedHandlerProperty, value);
        }
        static readonly DependencyProperty SelectionChangedHandlerProperty =
            DependencyProperty.RegisterAttached("SelectionChangedHandler", typeof(SelectionChangedEventHandler),
            typeof(DataGridService), new UIPropertyMetadata(null));

        //d is MultiSelector (d as ListBox not supported)
        static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
        {
            if (GetSelectionChangedHandler(d) != null)
                return;

            if (d is MultiSelector)//DataGrid
            {
                MultiSelector multiselector = d as MultiSelector;
                SelectionChangedEventHandler selectionchanged = null;
                foreach (var selected in (d as DataGrid).SelectedItems) // GetSelectedItems(d) as IList)
                    multiselector.SelectedItems.Add(selected);

                selectionchanged = (sender, e) =>
                {
                    SetSelectedItems(d, multiselector.SelectedItems);
                };
                SetSelectionChangedHandler(d, selectionchanged);
                multiselector.SelectionChanged += GetSelectionChangedHandler(d);
            }
            else if (d is ListBox)
            {
                ListBox listbox = d as ListBox;
                SelectionChangedEventHandler selectionchanged = null;

                selectionchanged = (sender, e) =>
                {
                    SetSelectedItems(d, listbox.SelectedItems);
                };
                SetSelectionChangedHandler(d, selectionchanged);
                listbox.SelectionChanged += GetSelectionChangedHandler(d);
            }
        }

        public static IList GetSelectedItems(DependencyObject obj)
        {
            return (IList)obj.GetValue(SelectedItemsProperty);
        }

        public static void SetSelectedItems(DependencyObject obj, IList value)
        {
            obj.SetValue(SelectedItemsProperty, value);
        }

Это прекрасно работает для получения выбранных элементов в модели представления, когда пользователь нажимает кнопку или что-то в этом роде.Моя проблема в том, что при загрузке экрана мне нужно выделить элементы, которые были ранее выбраны.Я безуспешно пытался установить свойство SelectedPartTypes в конструкторе виртуальной машины, предполагая, что двусторонняя привязка позаботится об этом.Существует ли простой способ показать, какие элементы выбраны при загрузке элемента управления?

1 Ответ

2 голосов
/ 23 сентября 2011

Не можете ли вы связать свойство IsSelected в стиле ListBoxItem?

<Style TargetType="ListBoxItem">
    <Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>

Если у ваших объектов данных нет свойства для отслеживания выбора, вам может потребоваться использовать конвертер для возвратаистина, если текущий объект находится в пределах SelectedPartTypes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...