В настоящее время я внимательно изучаю отличный инструментарий Лорана, и у меня возник следующий вопрос.
Из Blend 4 я добавил EventTrigger для события Loaded, в моей 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 содержит следующее (для 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 в качестве обходного пути.
Я надеялся, что смогу ретранслировать любое событие, предлагаемое элементом управления, чтобы в этом случае вместо этого работало следующее:
<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, в котором событие Loaded запускается, а событие ColumnsPopulated (эквивалентно событию AutoGeneratingColumn) - нет.
DevExpress предоставил следующую информацию по моему вопросу:
«Мы рассмотрели этот вопрос и пришли к интересному выводу. Похоже, что визуальное дерево не строится в тот момент, когда обрабатываются триггеры Interaction.Trigger»
Если это правда, и нет другого способа вызвать события в ViewModel, тогда нужно будет пойти дальше и - методом проб и ошибок - отметить, какие из событий DataGrid (из которых более 100) можно вызывать таким образом, а чего нельзя!
Хотелось бы думать, что каждое событие, которое доступно в коде программной части, также может быть достигнуто при применении шаблона MVVM.
Я искал ответ, но не могу исключить, что что-то упустил, поэтому, если это так, примите мои извинения!