Применение нескольких AttachedCommandBehaviors, используя стиль - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь использовать AttachedCommandBehavior V2 для преобразования событий ListBoxItem, таких как двойной щелчок, в команды, которые выполняются для модели представления.

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

<Border Background="Yellow" Width="350" Margin="0,0,10,0" Height="35" CornerRadius="2" x:Name="test">
    <local:CommandBehaviorCollection.Behaviors>
            <local:BehaviorBinding Event="MouseLeftButtonDown" Action="{Binding DoSomething}" CommandParameter="An Action on MouseLeftButtonDown"/>
            <local:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/>
    </local:CommandBehaviorCollection.Behaviors>
    <TextBlock Text="MouseDown on this border to execute the command"/>
</Border>

Так как я хочу применить это к ListBoxItem, я пытаюсь сделать это через стиль, выполнив:

<ListBox.ItemContainerStyle>
    <Style>
        <Setter Property="acb:CommandBehaviorCollection.Behaviors">
            <Setter.Value>
                <acb:CommandBehaviorCollection>
                    <acb:BehaviorBinding Event="MouseDoubleClick" Command="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ListBox}}" CommandParameter="{Binding}"/>
                    <acb:BehaviorBinding Event="KeyUp" Command="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ListBox}}" CommandParameter="{Binding}"/>
                </acb:CommandBehaviorCollection>
            </Setter.Value>
        </Setter>
    </Style>
</ListBox.ItemContainerStyle>

Но я получаю ошибку компиляции с этим кодом, который говорит error MC3089: The object 'CommandBehaviorCollection' already has a child and cannot add 'BehaviorBinding'. 'CommandBehaviorCollection' can accept only one child. Line 39 Position 11.

Также, если я закомментирую одно из BehaviorBindings, то оно компилируется, но я получаю исключение загрузки xaml во время выполнения, говорящее «Значение не может быть нулевым. Имя параметра: свойство», поэтому я не уверен, что я даже беру правильный подход.

Может ли кто-нибудь предоставить пример правильного синтаксиса для установки нескольких привязок поведения в ListBoxItem?

1 Ответ

1 голос
/ 16 марта 2012

Мое решение использует триггеры взаимодействия и ItemTemplate, а не ItemContainerStyle.Это вызывает команду двойного щелчка мыши или ввода ключа в текстовом поле, а не весь элемент списка.

<UserControl.Resources>
    <DataTemplate DataType="{x:Type ViewModel:DataItem}" x:Key="ItemTemplate">
        <ContentControl>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick">
                    <i:InvokeCommandAction Command="{Binding DoubleClickCommand}"/>
                </i:EventTrigger>
                <i:EventTrigger EventName="KeyUp">
                    <i:InvokeCommandAction Command="{Binding KeyUpCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <TextBox Text="{Binding Name}">
            </TextBox>
        </ContentControl>
    </DataTemplate>
</UserControl.Resources>

<ListBox x:Name="listBox" ItemTemplate="{StaticResource ItemTemplate}" ItemsSource={Binding Items} />

Где DataItem - что-то вроде

class DataItem : INotifyPropertyChanged
{
   public string Name{get;set}
   .. etc
}

и набор модели представленияв DataContext имеет свойство IList<DataItems> Items{get; private set}.

...