【问题标题】:ListBox with ItemTemplate: SelectionChanged not fired带有 ItemTemplate 的 ListBox:SelectionChanged 未触发
【发布时间】:2010-10-27 10:08:50
【问题描述】:

带有 ItemTemplate 的 ListBox:SelectionChanged 未触发 怎么了?

<ListBox ItemsSource="{Binding Source1}" SelectionChanged="ListBox_SelectionChanged" SelectedItem="{Binding CurrentItem, Mode=TwoWay}" HorizontalAlignment="Stretch" Margin="0" Padding="0">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="0">

                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition Height="1" />
                </Grid.RowDefinitions>

                <Button Grid.Row="0" BorderThickness="0" Background="Transparent" HorizontalAlignment="Stretch">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <cmd:EventToCommand Command="{Binding FirstCommand}" PassEventArgsToCommand="True" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <Button.Template>
                        <ControlTemplate>
                            <Grid HorizontalAlignment="Stretch">

                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="65" />
                                    <ColumnDefinition Width="30"/>
                                </Grid.ColumnDefinitions>

                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Title}" Style="{StaticResource ListBoxTextStyle}" />
                                <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Title1}" Margin="5,0" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center" />

                            </Grid>
                        </ControlTemplate>
                    </Button.Template>
                </Button>

                <Border Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" BorderBrush="#FFFFFF" HorizontalAlignment="Stretch" BorderThickness="0,1,0,0" />

            </Grid>

        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
        </Style>
    </ListBox.ItemContainerStyle>

</ListBox>

【问题讨论】:

    标签: silverlight data-binding


    【解决方案1】:

    ListBoxItem 将在ListBox 收到点击事件时被选中。然而,模板内的按钮将接收并处理点击事件。因此ListBox 不会看到该事件。

    由于您在视图模型上调用命令,请考虑让视图模型将当前项设置为选定项。

    【讨论】:

    • 还有其他解决方案吗?您的意思是,我需要向父 ViewModel 发送消息来设置 SelectedItem?
    • 是的,这就是我的意思。您对EventCommand 的使用使我得出结论,您不喜欢将代码放在您的视图中。没有其他解决方案可以避免编写更多代码,并且可以选择将代码放在 ViewModel 中而不是 View 本身中。
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多