Ciphra
Ciphra

Reputation: 269

Dynamically generated buttons seem to not fire their commands?

I have a ListBox which is dynamically filled during runtime. It has a DataType of RequirementPreview which is needed to bind certain properties to triggers, sources and parameters. There is, however, 1 command-binding that needs to trigger a command that is set in the datacontext but has nothing to do with the template datatype.

What I want is that the Button fires the 'RevertDelete'-command and sends the Guid of the RequirementPreview to which the button belongs. As of now, nothing happens when I press the button.

Xaml:

<ListBox Grid.Row="1" Grid.ColumnSpan="3" Margin="5" IsEnabled="{Binding IsEnabled}" ItemsSource="{Binding Requirements}" SelectionMode="Extended">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="SelectionChanged">
          <cmd:EventToCommand Command="{Binding SelectionChanged}"/>
      </i:EventTrigger>
   </i:Interaction.Triggers>
   <ListBox.ItemContainerStyle>
      <Style TargetType="ListBoxItem">
         <Style.Triggers>
            <DataTrigger Binding="{Binding IsDeleted}" Value="True">
                <Setter Property="Foreground" Value="red"/>
            </DataTrigger>
         </Style.Triggers>
         <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
         <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
      </Style>
   </ListBox.ItemContainerStyle>
      <ListBox.ItemTemplate>
         <DataTemplate DataType="{x:Type myModels:RequirementPreview}">
            <Grid>
               <Grid.ColumnDefinitions>
                 <ColumnDefinition Width="Auto"/>
                 <ColumnDefinition Width="45"/>
                 <ColumnDefinition Width="*"/>
               </Grid.ColumnDefinitions>

               <TextBlock Grid.Column="0" Text="{Binding Name}" ToolTip="{Binding Name}" HorizontalAlignment="Stretch"/>
               <Button Grid.Column="2" HorizontalAlignment="Right" IsEnabled="{Binding IsEnabled}" Visibility="{Binding IsDeleted, Converter={StaticResource BoolToVisibility}}" 
                                        Command="{Binding RevertDelete}" CommandParameter="{Binding Guid}" Height="10" Width="10"/>
            </Grid>
         </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Xaml.cs:

    [Dependency]
    public IMainViewModel ViewModel
    {
        get { return this.DataContext as IMainViewModel; }
        set { this.DataContext = value; }
    }

Edit: Tried messing around with the databinding;

Command="{Binding RelativeSource={x:Static RelativeSource.PreviousData}, Path=RevertDelete}"

Command="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=RevertDelete}"

Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=RevertDelete}

Neither made a difference.

Upvotes: 0

Views: 57

Answers (1)

icebat
icebat

Reputation: 4774

I guess RevertDelete command is not a part of RequirementPreview type which works as a data context for the template. You'll need to use relative source binding for this command:

<Button Command="{Binding DataContext.RevertDelete, RelativeSource={RelativeSource AncestorType=ListBox}}" 
        CommandParameter="{Binding Guid}" />

Upvotes: 1

Related Questions