Как использовать Command и EventTrigger в кнопке DataTemplate? - PullRequest
3 голосов
/ 11 октября 2010

У меня есть кнопка в шаблоне данных, которая связана с командой в моей модели представления.У кнопки также есть EventTrigger, который запускает раскадровку, которая скрывает элементы управления редактирования (частью которых является кнопка).

Раскадровка работает нормально, если я выбираю событие PreviewMouseDown, но команда никогда не вызывается,Если я возьму событие MouseDown в EventTrigger, команда сработает, но раскадровка не будет выполнена.

Как получить команду и раскадровку для выполнения при нажатии кнопки?

<Button Content="Save" Command="{Binding SaveCommand}" >
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.PreviewMouseDown">
            <EventTrigger.Actions>
                <BeginStoryboard Storyboard="{DynamicResource sbCloseTitleEdit}"/>
            </EventTrigger.Actions>
        </EventTrigger>
    </Button.Triggers>
</Button>

Ответы [ 3 ]

1 голос
/ 12 октября 2010

В итоге я нерешительно решил свою проблему, добавив файл code-behind для моего ResourceDictionary, который содержит DataTemplate. Я не знал, что это возможно, но нашел это объяснение:

Можно ли установить код за словарем ресурсов в WPF для обработки событий?

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

Все еще ищу лучшее решение, если у кого-то есть.

0 голосов
/ 09 ноября 2013

Я достиг этого, вызвав команду в триггере событий вместе с другим действием, которое вы хотите вызвать:

<Button Command="{Binding AcceptCommand}" Content="Accept">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <i:InvokeCommandAction Command="{Binding AcceptCommand}"/>
      <triggers:UpdatePropertyAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType={x:Type Controls:ChildWindow}, Mode=FindAncestor}}" TargetProperty="DialogResult" Value="True"  />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Button>
0 голосов
/ 10 декабря 2010

Я попробовал ваш код и обнаружил, что он работает нормально с триггером события на PreviewMouseDown, просто сначала выполняется команда, а затем запускается анимация.

Вот мои ресурсы

<Storyboard x:Key="sbCloseTitleEdit">
  <ColorAnimation Storyboard.TargetProperty="(Rectangle.Fill).Color" 
                  To="Blue" Duration="0:0:3" Storyboard.TargetName="rect" >
  </ColorAnimation>
</Storyboard>

мой xaml

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto" />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <Button Content="Save" Command="{Binding SaveCommand}" >
    <Button.Triggers>
      <EventTrigger RoutedEvent="Button.PreviewMouseDown">
        <EventTrigger.Actions>
          <BeginStoryboard 
            Storyboard="{StaticResource sbCloseTitleEdit}"/>
        </EventTrigger.Actions>
      </EventTrigger>
    </Button.Triggers>
  </Button>
  <Rectangle Name="rect" Width="30" Height="30" 
             Grid.Column="1" Fill="Red" />
</Grid>

и модель моего взгляда

public class MainViewModel
{
    public ActionCommand SaveCommand { get; private set; }
    public MainViewModel()
    {
        SaveCommand = new ActionCommand();
    }
}

public class ActionCommand : ICommand
{
    public void Execute(object parameter)
    {
        // gets fired if event trigger is preview mode
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
}

Вы уверены, что ничего не пропустили?

...