WPF - Freezable в стиле кнопки, не наследующей DataContext - PullRequest
0 голосов
/ 06 февраля 2011

Я моделирую шаблон присоединенной команды после библиотеки AttachedCommandBehavior здесь .Моя кнопка выглядит следующим образом:

<Button>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="vms:Attached.Behaviors">
                <Setter.Value>
                    <vms:Behaviors>
                        <vms:Behavior Event="Click" 
                                      Command="{Binding ClickCommand}" />
                    </vms:Behaviors>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>

Все отлично работает, но когда выполняется установщик на Behavior, команда имеет значение null.

Поведение - это Freezable, а Поведение - это FreezableCollection<Behavior>.Кажется, он просто не наследует DataContext от Button.

С другой стороны, это работает правильно:

<Button>
    <vms:Attached.Behaviors>
        <vms:Behavior Event="Click" Command="{Binding ClickCommand}" />
    </vms:Attached.Behaviors>
</Button>

К сожалению, я не могу сделать это таким образом, потому чтоМне нужно нацелиться на сгенерированные ListViewItem s, используя ItemContainerStyle.

Есть ли способ получить DataContext в стиле?

Ответы [ 2 ]

1 голос
/ 06 февраля 2011

Библиотека «Attached Command Behavior» - это зародыш идеи, ставшей Blend Behaviors. Blend Behaviors намного более мощные и стандартизированные, поэтому я рекомендую вам перейти на их использование. Но используете ли вы Attached Command Behavior или Blend Behaviors, проблема существенно одна и та же: они не работают должным образом при попытке установить их с помощью стиля. Я решил эту проблему для Blend Behaviors с полной поддержкой связывания в этом ответе StackOverflow:

Без тестирования, я думаю, вам нужно переместить поведение ACB на ресурс, помеченный x:Shared="False", чтобы привязка работала.

0 голосов
/ 20 февраля 2012

У меня была та же проблема, и использование RelativeSource помогло. Я покажу вам мой код до и после ...

До: (это не работает)

<DataTemplate x:Key="MenuNodeWithChildrenTemplate">
    <StackPanel Orientation="Horizontal"
            behaviors:EventCommand.CommandToRun="{Binding OpenMenuItem}"
            behaviors:EventCommand.EventName="MouseLeftButtonUp">
        <Label Content="{Binding Title}"/>
        <Label Content="{Binding Description}"/>
    </StackPanel>
</DataTemplate>

После: (это работает)

<DataTemplate x:Key="MenuNodeWithChildrenTemplate">
    <StackPanel Orientation="Horizontal"
            behaviors:EventCommand.CommandToRun="{Binding Path=DataContext.OpenMenuItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}}"
            behaviors:EventCommand.EventName="MouseLeftButtonUp">
        <Label Content="{Binding Title}"/>
        <Label Content="{Binding Description}"/>
    </StackPanel>
</DataTemplate>

Вам, очевидно, придется настроить параметры Относительного источника в соответствии с вашей конкретной ситуацией. Кажется, что по какой-то причине присоединенные свойства не наследуют контекст данных, поэтому вы должны сказать, если как.

...