Добавление элемента в коллекцию из стиля - PullRequest
0 голосов
/ 07 января 2020

У меня есть стиль, который нацелен на DataGrids в Grid.

<Grid.Resources>
    <Style TargetType="DataGrid">
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="AutoGenerateColumns" Value="False" />
    </Style>
</Grid.Resources>

Я бы хотел добавить EventTrigger (используя библиотеку Microsoft XAML Behaviors для WPF ) в этом стиле.

<b:EventTrigger EventName="SelectionChanged">
    <b:InvokeCommandAction Command="{Binding UpdateSelection}" CommandParameter="{Binding SelectedItem}" />
</b:EventTrigger>

Однако, это:

<Grid.Resources>
    <Style TargetType="DataGrid">
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="AutoGenerateColumns" Value="False" />
        <Setter Property="b:Interaction.Triggers">
            <Setter.Value>
                <b:EventTrigger EventName="SelectionChanged">
                    <b:InvokeCommandAction Command="{Binding UpdateSelection}" CommandParameter="{Binding SelectedItem}" />
                </b:EventTrigger>
            </Setter.Value>
        </Setter>
    </Style>
</Grid.Resources>

завершается с ошибкой XamlParseException :

'Установить свойство' System. Windows .Setter.Property 'сгенерировал исключение.' Номер строки '28' и позиция строки '22'.

Внутреннее исключение 1:
ArgumentNullException: значение не может быть нулевым.
Имя параметра: свойство

Хотя представленное исключение, похоже, не связано, я предполагаю, что это потому, что я пытаюсь установить Interaction.Triggers свойство присоединенной коллекции с помощью одного EventTrigger вместо добавления EventTrigger в коллекцию.

Как я могу добавить элемент в коллекцию в стиле в XAML?

1 Ответ

0 голосов
/ 07 января 2020

Вы не можете добавить триггер взаимодействия в Style. Это не поддерживается.

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

public class SelectionChangedBehavior
{
    public static ICommand GetCommand(DataGrid dataGrid)
    {
        return (ICommand)dataGrid.GetValue(CommandProperty);
    }

    public static void SetCommand(DataGrid dataGrid, ICommand value)
    {
        dataGrid.SetValue(CommandProperty, value);
    }

    public static object GetCommandParameter(DataGrid dataGrid)
    {
        return dataGrid.GetValue(CommandParameterProperty);
    }

    public static void SetCommandParameter(DataGrid dataGrid, object value)
    {
        dataGrid.SetValue(CommandParameterProperty, value);
    }

    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached(
        "Command",
        typeof(ICommand),
        typeof(SelectionChangedBehavior),
        new UIPropertyMetadata(null, OnCommandChanged));

    public static readonly DependencyProperty CommandParameterProperty =
        DependencyProperty.RegisterAttached(
        "CommandParameter",
        typeof(object),
        typeof(SelectionChangedBehavior),
        new UIPropertyMetadata(null));


    private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        DataGrid dataGrid = d as DataGrid;
        if (dataGrid != null)
            dataGrid.SelectionChanged += OnSelectionChanged;
    }

    private static void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataGrid dataGrid = (DataGrid)sender;
        ICommand command = GetCommand(dataGrid);
        if (command != null)
            command.Execute(GetCommandParameter(dataGrid));
    }
}

XAML:

<Style TargetType="DataGrid" xmlns:local="clr-namespace:WpfApp1">
    <Setter Property="IsReadOnly" Value="True" />
    <Setter Property="AutoGenerateColumns" Value="False" />
    <Setter Property="local:SelectionChangedBehavior.Command" Value="{Binding UpdateSelection}" />
    <Setter Property="local:SelectionChangedBehavior.CommandParameter" Value="{Binding SelectedItem}" />
</Style>

WpfApp1 относится к пространству имен класса SelectionChangedBehavior в приведенном выше примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...