Frage

Ich habe einen Knopf in einem Datatemplate, das auf einen Befehl in meinem Viewmodel gebunden ist. Der Knopf hat auch einen Eventtrigger, dass Kicks aus einem Storyboard, dass Haut des Edit-Steuerelemente (von denen die Taste ein Teil ist.)

Das Storyboard funktioniert gut, wenn ich die Preview Veranstaltung abholen, aber der Befehl wird nie aufgerufen. Wenn ich das Mousedown-Ereignis in meinem Eventtrigger abholen, der Befehl funktioniert, aber die Storyboard nicht ausgeführt werden.

Wie kann ich beide bekommen den Befehl und das Storyboard auszuführen, wenn die Schaltfläche geklickt wird?

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

Lösung

beendete ich mein Problem unelegant Lösung, indem Sie einen Code-Behind-Datei für meine Resource hinzufügen, die die Datatemplate enthält. Ich war nicht bewusst, dass dies möglich war, fand aber diese Erklärung:

Ist es möglich, Code-Set hinter einem Ressourcenverzeichnis in WPF für Ereignisbehandlung?

Statt die Eventtrigger der Verwendung ein Storyboard zu beginnen, dass Haut der Edit-Steuerelemente ich einen Click-Handler, um den Code-behind hinzugefügt. Es ist ein bisschen kludgy wie ich die Platten in Bezug auf die Schaltfläche geklickt finden haben, wie das ist die einzige Referenz, aber es funktioniert.

Sie immer noch nach einer besseren Lösung suchen, wenn jemand eine hat.

Andere Tipps

versuchte Ive Code, und ich finde, dass es OK mit dem Ereignisauslöser auf PreviewMouseDown funktioniert, es ist nur, dass der Befehl zuerst ausgeführt wird, dann wird die Animation ausgelöst wird.

Heres meine Ressourcen

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

meine 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>

und meine Ansicht nach Modell

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;
}

Sie sind sicher, dass Sie etwas haben verpasst?

ich erreichte dies, indem Sie den Befehl in dem Eventtrigger zusammen mit der anderen Aktion aufrufen Sie auslösen wollen:

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top