【问题标题】:WP8 LongListSelector firing SelectionChanged event when CheckBox is clicked单击 CheckBox 时 WP8 LongListSelector 触发 SelectionChanged 事件
【发布时间】:2013-01-29 20:57:47
【问题描述】:

我有一个新的 Windows Phone 8 LongListSelector 的简单数据模板,如下所示:

<DataTemplate>
    <StackPanel Orientation="Horizontal" Margin="0,-6,0,-10">
        <CheckBox x:Name="ToDoCheckBox" Margin="0" IsChecked="{Binding ItemIsComplete}" Checked="ToDoCheckBox_Checked"/>
        <TextBlock Text="{Binding ItemName}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeExtraLarge}"/>
    </StackPanel>
</DataTemplate>

模板中应该还有一些项目,这就是没有使用 CheckBox 的 content 属性的原因。

现在,我在 SelectionChanged 事件上实现了页面导航。问题是,即使单击 CheckBox,SelectionChanged 也会被触发。较早的问题似乎讨论了完全相反的问题。我不希望 SelectionChanged 被解雇。或者,至少我不希望页面在 CheckBox 事件上导航。我只想让复选框选中或未选中的事件。我该如何实现?

【问题讨论】:

    标签: wpf xaml windows-phone-8


    【解决方案1】:

    选择是触发导航的不好方法。无需深入研究,您可以通过在模板中的其他项目被点击时触发导航来避免这种情况。
    例如

    <DataTemplate>
        <StackPanel Orientation="Horizontal" Margin="0,-6,0,-10">
            <CheckBox x:Name="ToDoCheckBox" Margin="0" IsChecked="{Binding ItemIsComplete}" Checked="ToDoCheckBox_Checked"/>
            <TextBlock Text="{Binding ItemName}"
                       TextWrapping="NoWrap"
                       Style="{StaticResource PhoneTextExtraLargeStyle}"
                       FontSize="{StaticResource PhoneFontSizeExtraLarge}"
                       Tap="TriggerNavigationToThisItem"/>
        </StackPanel>
    </DataTemplate>
    

    以上假设您有一个名为TriggerNavigationToThisItem 的事件将触发导航。您还可以在 Item 上添加命令并绑定到该命令以触发导航。

    如果您有一个更复杂的模板,您可以将它们封装在一个容器中(如Grid),然后让它触发导航。

    【讨论】:

    • 虽然我已将您标记为答案,但我想知道为什么选择是一种不好的导航方式!
    • @akshay2000 简短回答:选择是触发导航的不好方法,因为当您实际尝试执行其他操作(例如滚动)时,很容易意外触发选择。 Tap 事件是一个更好的导航触发器,因为在滑动或滚动时意外触发点击事件要困难得多。
    【解决方案2】:

    您可以检查每个选择更改事件的原始来源。如果是复选框 - 只需跳过执行即可。

    还有。根本不要使用本机“LongListSelector.Selected”属性和选择事件。它完全没有可扩展性(例如多选)。使用您自己的 Tap 事件处理来实现它。

    【讨论】:

    • 我需要一些解释!如何检查原始执行源?为什么人们如此反对 SelectionChanged 和 SelectedItem?
    • 在 Tap 事件处理程序上,e.OriginalSource 返回一个已被点击的原始 FrameworkElement。你可以试试 CheckBox ifCheck=(CheckBox) e.OriginalSource。如果 ifCheck!=null 则表示该复选框是原始来源,您无需将此列表项标记为选中。
    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多