Как определить выбор строки в Xceed DataGrid для WPF

Я ужасно разбираюсь в WPF, так что терпите меня.

Я использую Xceed DataGrid для WPF, и мне нужно знать, когда кто-то выбирает строку, но я не могу понять, как это сделать. Я уверен, что мне нужно добавить некоторый XAML, чтобы включить это, но я не могу понять, что мне делать.


person Jonathan Beerhalter    schedule 27.10.2009    source источник


Ответы (5)


Я использую подход MVVM и поэтому предпочитаю привязку данных. Я привяжу свойство SelectedItem к свойству SelectedItem в моем объекте ViewModel для сетки.

<xcdg:DataGridControl x:Name="grid" SelectedItem="{Binding SelectedItem}">
</xcdg:DataGridControl>

Затем ваш установщик свойств может делать все, что необходимо, при изменении метода SelectedItemChanged().

private IMyItem _selectedItem;
public IMyItem SelectedItem
{
   get { return _selectedItem; }
   set { 
          _selectedItem = value;
          OnPropertyChanged("SelectedItem");
          SelectedItemChanged();
       }
}
person Mark Lindell    schedule 29.03.2010

На самом деле я сам немного борюсь с тем же, за исключением того, что у меня есть предварительное условие, чтобы уведомление о выборе выполнялось через ICommand; однако, если у вас нет такой необходимости, вы можете подключить обработчик события SelectionChanged. Это довольно элементарно, но я на всякий случай включу код:

XAML:

 <Grid>
    <DataGrid:DataGridControl x:Name="gridControl" SelectionChanged="gridControl_SelectionChanged">
        <!-- Content -->
    </DataGrid:DataGridControl>
</Grid>

Код программной части:

private void gridControl_SelectionChanged(object sender, Xceed.Wpf.DataGrid.DataGridSelectionChangedEventArgs e)
        {
        var selectedIndex = gridControl.SelectedIndex; // int index
        var selectedItem = gridControl.SelectedItem;   // instance of bound object
        var selectedItems = gridControl.SelectedItems; // IList of bound objects
        }

Все сказанное, мне очень интересно узнать, есть ли какие-либо элегантные решения для получения выбранной строки из Xceed DataGrid с помощью ICommand (в моем случае я использую анонимные типы, которые могут иметь значение)...

person egoodberry    schedule 28.10.2009
comment
В моей сетке Xceed нет этого события, поэтому это было невозможно. У вас есть профессиональная версия? - person Jonathan Beerhalter; 28.10.2009
comment
Ах, да, я знаю... не понимал, что они будут ограничивать обработчики событий. Мне кажется странным. - person egoodberry; 28.10.2009

Вам не нужно писать сложный код для чего-то простого... хотя это может стать утомительным, вот код для вас. Надеюсь, это поможет:

<Style TargetType="xcdg:DataRow">
   <EventSetter Handler="dr_PreviewMouseDown" Event="PreviewMouseDown" />
</Style>

void dr_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
   DataRow dr = sender as DataRow;

   Debug.WriteLine(sender);
}
person Nerd in Training    schedule 19.10.2011

Итак, вот что я придумал

    System.ComponentModel.DependencyPropertyDescriptor gridItemsSourceDescriptor = System.ComponentModel.DependencyPropertyDescriptor.FromProperty(DataGridControl.SelectedItemProperty, typeof(DataGridControl));
    gridItemsSourceDescriptor.AddValueChanged(dgBaxRuns, HandleSelectionChanged);
person Jonathan Beerhalter    schedule 28.10.2009
comment
Следует быть осторожным с использованием этих дескрипторов, так как они вызывают утечку памяти. support.microsoft.com/kb/938416 - person Stephen Drew; 01.07.2013

Я сделал для себя самый простой способ.

<xctk:MaterialButton Margin="5,0,5,0" Grid.Column="3" Content="Szűrt sorok kijelölése" Command="{Binding SelectFilteredRowsCommand}" CommandParameter="{Binding ElementName=MyDataGrid}" />

Итак, я отправляю свою сетку данных с моим параметром команды в модель представления.

 public RelayCommand<object> SelectFilteredRowsCommand { get; set; }

SelectFilteredRowsCommand = new RelayCommand<object>((o) =>
            {
                var datagrid = o as DataGridControl;
                if (datagrid != null)
                {
                    var datagriditems = datagrid.Items.Cast<SelectableProduct>();
                    foreach (SelectableProduct selectableProduct in datagriditems)
                    {
                        selectableProduct.IsSelect = true;
                    }
                }
            });

И конвертируйте обратно в тип datagrid itemsource.

person Birek    schedule 27.05.2016