OnGeneratingColumn WPF Datagrid не запускается при использовании триггеров событий - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь проверить это на простом уровне, где у меня есть следующий TasksDatagridView.xaml:

<UserControl x:Class="Example.Views.TasksDatagridView" ...>
    <UserControl.Resources>
        <local:CompleteConverter x:Key="completeConverter" />
        <local:Tasks x:Key="tasks" />
        <CollectionViewSource x:Key="cvsTasks" Source="{Binding Path=tasks}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="ProjectName"/>
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </UserControl.Resources>
    <Grid>
        <DataGrid x:Name="myDG" AutoGenerateColumns="True" ItemsSource="{Binding Source={StaticResource cvsTasks}}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="AutoGeneratingColumn">
                    <i:InvokeCommandAction Command="{Binding GenColumns}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </DataGrid>
    </Grid>
</UserControl>

В моем TasksDatagridView.xaml.cs я попытался оба сначала установить текстовый текстовый текст this.DataContext = new ViewModels.TaskDgVm(), а затемInitializeComponent() и наоборот.

В моем главном окне MainWindow.xaml я ссылаюсь на элемент управления следующим образом:

<Window x:Name="MainWindow" x:Class="Example.Views.MyMainWindowView" ...>
  <Grid>
    <local:TasksDatagridView x:Name="tview" />
  </Grid>
</Window>

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

  1. В строке MainWindow.xaml, где я ссылаюсь на элемент управления: <local:TasksDatagridView x:Name="tview" /> он говорит, что выдает исключение system.exception, но код все еще компилируется и выполняетсяхорошо.

  2. AutoGeneratingColumn не запускается.

На самом деле я пытаюсь выяснить # 2 и почему это конкретное событие не запускается.Прямо сейчас у меня есть простая печать в методе execute, и при замене имени события простым щелчком или загруженным событием для сетки данных команда работает нормально, и почти любое другое событие запускается, что говорит мне, что это не что-то в моей viewmodel иликласс команд делегата.Любые мысли о том, почему событие autogenerate column не работает с командой?Примечание. Я убедился, что имя события не написано с ошибкой.

Редактировать: После публикации вопроса я нашел здесь связанный вопрос: MVVM - WPF DataGrid - Событие AutoGeneratingColumn Однако они используют mvvm-light инструментарийгде я использую библиотеку интерактивности смесь выражений.Хотя один и тот же ответ может относиться к обоим вопросам, на самом деле это два отдельных набора инструментов.

1 Ответ

0 голосов
/ 15 октября 2018

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

Но есть альтернатива, которая решает проблему, избегая кода:

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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...