Как получить SelectedItem из набора инструментов DataGrid, который находится на UserControl в WPF с использованием шаблона MVVM - PullRequest
0 голосов
/ 27 декабря 2010

Мой вопрос, если он очень похож на вопрос "Предоставление DataGrid SelectedItem в родительском UserControl в WPF", который находится здесь на этом форуме. У меня есть XAML-файл, в котором есть два элемента UserControl, которые используются в окне master-detail. Первый UserControl - это просто DataGrid, который содержит некоторые виджеты, а второй содержит подробную информацию о выбранном виджете. Я пытаюсь использовать шаблон MVVM, поэтому я стараюсь избегать использования RoutedEventHandler для обработки события SelectionChanged объекта DataGrid. Я создал RoutedEventHandler, чтобы проверить, будет ли мой UserControl Detail-info заполнен selectedItem из DataGrid, и он это сделал. Итак, я доказал, что это сработало.

Теперь, после удаления RoutedEventHandler и продолжения использования свойства зависимостей SelectedItem, чтобы позволить UserControl, который отображает подробную информацию, ничего не отображается в этом UserControl при изменении выбора DataGrid. My View должен знать об изменениях. Я прочитал статью Джоша Смита, в которой он приводит пример с использованием списка. Я прочитал довольно много постов / блогов, но большинство из них не дают ответа или не используют DataGrid в UserControl.

На мой взгляд, я устанавливаю DataContext моего окна в windowViewModel, который возвращает коллекцию widgetViewModel, и я также устанавливаю DataConext группового блока в том же окне, в котором содержится информация о виджете Detail, в свойство зависимостей windowViewModel.SelectedItem.

вот основной код

<UserControl.Resources>

    <Style x:Key="WidgetItemStyle" TargetType="{x:Type toolkit:DataGridRow}">
        <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
    </Style>

</UserControl.Resources>
<Grid>
    <toolkit:DataGrid 
       x:Name="dgWidgets" 
       DataContext="{StaticResource WidgetsList}"
       ItemsSource="{Binding}"
       SelectedItem="{Binding ElementName=WidgetsUserControl, Path=SelectedItem, Mode=TwoWay}"
       SelectionUnit="FullRow"
       SelectionChanged="dgWidgets_SelectionChanged"
       IsSynchronizedWithCurrentItem="true"
       ItemContainerStyle="{StaticResource WidgetItemStyle}"
       >
       <toolkit:DataGrid.Columns>

.... столбец defs

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

var viewModel // эта переменная содержит windowViewModel

this.DataContext = viewModel;
this.gBox.DataContext = viewModel.SelectedItem;

Я уже давно борюсь с этим и до сих пор не знаю, в чем проблема.

1 Ответ

2 голосов
/ 27 декабря 2010

Вы здесь.Я заставил это работать, просто привязав SelectedItem к свойству "currentWidget" на моей виртуальной машине.Когда значение изменяется, вы знаете, что пользователь выбрал новую запись в основной сетке.Свяжите свой элемент управления сведениями с тем же свойством (если оно содержит все необходимые данные), и вы дома.

XAML

SelectedItem="{Binding currentWidget, Mode=TwoWay}"...

VM Code

private Widget _currentWidget;
public Widget currentWidget
{
        get { return _currentWidget; }
        set
        {
            _currentWidget = value;
            NotifyPropertyChanged("currentWidget");
        }
}
...