2010-10-07 7 views
1

В настоящее время я хорошо разбираюсь в инструментах от Laurent, и у меня есть следующий вопрос.MVVM - WPF DataGrid - событие AutoGeneratingColumn

из смеси 4, я добавил EventTrigger для нагруженного события, на мой ViewModel У меня есть следующие:

public RelayCommand rcAutoGeneratingColumn { get; private set; } 

В конструкторе у меня есть:

rcAutoGeneratingColumn = 
    new RelayCommand(o => DataGridAutoGeneratingColumn(o)); 

Также в ViewModel , У меня есть метод, который я хочу вызвать с помощью RelayCommand:

private void DataGridAutoGeneratingColumn(Object o) 
    { 
     DataGrid grid = (DataGrid)o; 

     foreach (DataGridTextColumn col in grid.Columns) 
     { 
      if (col.Header.ToString().ToLower() == "id") 
      { 
       col.Visibility = System.Windows.Visibility.Hidden; 
      } 
     } 
    } 

В моем XAML содержится fo llowing (для DataGrid):

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Loaded"> 
     <GalaSoft_MvvmLight_Command:EventToCommand 
      Command="{Binding rcAutoGeneratingColumn, Mode=OneWay}" 
      CommandParameter="{Binding ElementName=dataGrid1, Mode=OneWay}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Там нет никаких проблем здесь код работает просто отлично, но, очевидно, это событие используется для скрытия определенных столбцов должно быть AutoGeneratingColumn события и не грузятся. Я использовал событие Loaded как getaround.

Я надеялся, что я мог бы передать любое событие, предложенное контролем, так что в этом случае, следующий будет работать вместо:

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="AutoGeneratingColumn"> 
     <GalaSoft_MvvmLight_Command:EventToCommand 
      Command="{Binding rcAutoGeneratingColumn, Mode=OneWay}" 
      CommandParameter="{Binding ElementName=dataGrid1, Mode=OneWay}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Я не могу получить событие AutoGeneratingColumn, чтобы вызвать, и я Я надеюсь, что я что-то упустил и ценю любые советы!

Такое поведение является то же самое с GridControl от DevExpress, в том, что загруженная событие срабатывает тогда как ColumnsPopulated события (это является эквивалентом события AutoGeneratingColumn) нет.

DevExpress предложил следующую информацию относительно моего вопроса:.

"Мы рассмотрели этот вопрос, и пришли к интересному выводу Похоже, что визуальное дерево не строится в тот момент, когда взаимодействие . Обработчики обрабатываются "

Если это правда, и нет другого способа, с помощью которого можно вызвать события в ViewModel, тогда вам придется идти вперед и - используя пробную версию и ошибку - обратите внимание, какая из события DataGrid (из которых более 100) могут быть вызваны таким образом и которые не могут!

Хотелось бы думать, что каждое событие, доступное в коде, также может быть достигнуто при применении шаблона MVVM.

Я искал ответ, но я не могу исключить, что я что-то упустил, поэтому, если это так, то, пожалуйста, примите мои извинения!

ответ

-1

В ходе разработки проекта с MVVM у вас возникнут обстоятельства, при которых вы должны обрабатывать события в коде кода вашего представления, а EventToCommand просто не работает. Вы особенно найдете это с Silverlight, но я полагаю из вашего вопроса, что вы используете WPF. Это нормально, если вы делаете какую-либо обработку событий в кодовом коде зрения, просто не ставьте там никакой бизнес-логики. Вы даже можете оставить команду в своей модели просмотра, просто вызовите ее непосредственно из обработчика событий.

((YourViewModel)this.DataContext).rcAutoGeneratingColumn.Execute(sender); 
+0

Здравствуйте, Мэтт, благодарю вас за ваши комментарии. Я не могу сказать, что я действительно имел в виду WPF, но вы выбрали это. Должен признаться, что я думал, что в коде не так-то нормально обрабатывать события, поэтому приятно слышать иначе. Разумеется, бизнес-логика не сохранилась. Мне также нравится ваше предложение кода! Спасибо, что помогли этому новичку :) – Dave

10

Вы не должны использовать злой код позади ;-) Вы можете сделать это с помощью прикрепленного поведения ...

public class AutoGeneratingColumnEventToCommandBehaviour 
{ 
    public static readonly DependencyProperty CommandProperty = 
     DependencyProperty.RegisterAttached(
      "Command", 
      typeof(ICommand), 
      typeof(AutoGeneratingColumnEventToCommandBehaviour), 
      new PropertyMetadata(
       null, 
       CommandPropertyChanged)); 

    public static void SetCommand(DependencyObject o, ICommand value) 
    { 
     o.SetValue(CommandProperty, value); 
    } 

    public static ICommand GetCommand(DependencyObject o) 
    { 
     return o.GetValue(CommandProperty) as ICommand; 
    } 

    private static void CommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var dataGrid = d as DataGrid; 
     if (dataGrid != null) 
     { 
      if (e.OldValue != null) 
      { 
       dataGrid.AutoGeneratingColumn -= OnAutoGeneratingColumn; 
      } 
      if (e.NewValue != null) 
      { 
       dataGrid.AutoGeneratingColumn += OnAutoGeneratingColumn; 
      } 
     } 
    } 

    private static void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     var dependencyObject = sender as DependencyObject; 
     if (dependencyObject != null) 
     { 
      var command = dependencyObject.GetValue(CommandProperty) as ICommand; 
      if (command != null && command.CanExecute(e)) 
      { 
       command.Execute(e); 
      } 
     } 
    } 
} 

Затем используйте его в XAML как это ...

<DataGrid ItemsSource="{Binding MyGridSource}" 
      AttachedCommand:AutoGeneratingColumnEventToCommandBehaviour.Command="{Binding CreateColumnsCommand}"> 
</DataGrid> 
+0

Получил мне некоторое время, чтобы понять, как использовать и что такое CreateColumnsCommand, но, наконец, я понял, что это метод режима просмотра с параметром DataGridAutoGeneratingColumnEventArgs. Работает как шарм, спасибо! – Mardok

 Смежные вопросы

  • Нет связанных вопросов^_^