2011-02-05 5 views
0

Я моделирую прикрепленный шаблон команды после AttachedCommandBehavior library here. Моя кнопка выглядит следующим образом:WPF - Freezable в стиле кнопки, не наследующей DataContext

<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 с с использованием ItemContainerStyle.

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

+0

Ваша ссылка не действительна. Можете ли вы отредактировать и исправить, пожалуйста? – Robaticus

+0

Упс, теперь исправлено. – Snea

+0

Я не совсем понимаю, как ваши 'vms: Attached.Behaviors' сопоставляются с этой библиотекой. Я могу найти только такие вещи, как 'CommandBehaviorCollection.Behaviors' и т. Д., Поэтому я не могу воспроизвести –

ответ

1

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

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

+0

Это выглядит очень многообещающе, я посмотрю на него. – Snea

+0

Это работало над примером кнопки выше, но, к сожалению, все еще не работало для «ItemContainerStyle» ListView. Любая идея, как она может работать для этого? – Snea

+0

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

0

У меня была та же проблема, и использование 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> 

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