ListBox项目中的ButtonControl中的按钮不会在WPF XAML中触发

时间:2014-05-20 12:07:34

标签: wpf xaml mvvm binding listbox

我在wpf:

中为ListBox设置了以下设置
  • ListBoxItemsPanel一个StackPanel(水平方向)
  • {li> ItemTemplate ListBoxGrid TextBoxItemsControl
  • 项目控件包含按ItemPanelWrapPanel
  • 的按钮

当我点击ItemsPanel中的一个按钮时,ICommand将不会在View.xodel类中触发,该类绑定到View.xaml。 看起来我正在选择ListBox项而不是ItemsControl中的项目。

这是xaml代码

<ListBox 
   Background="Transparent" 
   ItemTemplate="{StaticResource ProductGroupTemplate}" 
   FocusVisualStyle="{x:Null}" 
   VerticalContentAlignment="Top" 
   ItemsSource="{Binding NodeHeaders}" 
   Grid.Row="1" 
   Grid.ColumnSpan="3" 
   Grid.Column="0" 
   Grid.RowSpan="2" 
   SelectedItem="{Binding CurrentItem}" 
   BorderBrush="Transparent" 
   ScrollViewer.HorizontalScrollBarVisibility="Auto" 
   ScrollViewer.VerticalScrollBarVisibility="Disabled" 
   Margin="30,0,55,0" 
   VerticalAlignment="Top">
   <ListBox.Style>
      <Style TargetType="ListBox">
         <Setter Property="Visibility" Value="Collapsed" />
         <Style.Triggers>
            <DataTrigger Binding="{Binding HasParent}" Value="True">
               <Setter Property="Visibility" Value="Visible"/>
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </ListBox.Style>
   <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
         <StackPanel Orientation="Horizontal" IsItemsHost="True"/>
      </ItemsPanelTemplate>
   </ListBox.ItemsPanel>
</ListBox>

和DataTemplate

<DataTemplate x:Key="ProductGroupTemplate">
    <Grid Margin="0,0,20,0">          
        <Grid.RowDefinitions>
            <RowDefinition Height="40"/>
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>


        <TextBlock Text="{Binding Description}" FontSize="20" Grid.Row="0" Grid.Column="0" Foreground="{StaticResource DefaultLabelColor}" />
        <ItemsControl ItemsSource="{Binding Nodes}" Grid.Row="1" Grid.Column="0">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Vertical"  IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Text="{Binding Description}" Height="75" Width="150" Padding="5" Margin="5" Background="{StaticResource SalesItemsBackground}" 
                                Foreground="{StaticResource SalesItemsForeground}" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Left" Command="{Binding RelativeSource=
        {RelativeSource FindAncestor, 
        AncestorType={x:Type ContentControl}}, 
        Path=DataContext.Select}" CommandParameter="{Binding}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</DataTemplate>

2 个答案:

答案 0 :(得分:1)

如果您的视图模型声明了ICommand实例并且设置为视图的DataContextUserControlWindow),那么您可以使用该属性可以访问您的ICommand实例。来自Button中的DataTemplate,您可以使用此RelativeSource Binding

<Button Text="{Binding Description}" Height="75" Width="150" Padding="5" Margin="5" 
    Background="{StaticResource SalesItemsBackground}" TextAlignment="Left" 
    Foreground="{StaticResource SalesItemsForeground}" HorizontalAlignment="Center" 
    VerticalAlignment="Center" Command="{Binding DataContext.Select, RelativeSource={
    RelativeSource AncestorType={x:Type YourViewsPrefix:YourView}}}"
    CommandParameter="{Binding}"/>

答案 1 :(得分:0)

这是因为您的数据模板的DataContext设置为列表框中的项目。如果您有List&lt; Person&gt;绑定到列表框的每个列表框项的DataContext都是一个Person,这就是为什么你可以编写像&#34; {Binding Description}&#34;这样的东西。你有两种方法可以从DataTemplate执行一个命令,其中一个是&#34; Sheridan&#34;告诉过你了。作为替代方案,您可以将元素的DataContext设置为父视图或ViewModel。

<DataTemplate>
    <Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type View/ViewModel}}">
    </Grid>
</DataTemplate>