none
点击ListViewItem中的Button,如何获取选中的是第几行。 RRS feed

  • 问题

  • 我在ListViewItem中绑定Button,在Button的Click事件中想根据当前ListView的焦点值进行操作,然而由于路由事件是从叶子到根,此时ListView的焦点没有移动。我查文档,之前WPF好像有个Preview系列的事件,可以从根到叶子传递,但在win8 metro中没有这样的事件,请问我该如何处理?

    代码如下:

    <ListView.ItemTemplate>
                            <DataTemplate>
                                <Grid Width="446" Height="50">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="5*"/>
                                        <ColumnDefinition Width="2*"/>
                                        <ColumnDefinition Width="3*"/>
                                    </Grid.ColumnDefinitions>
                                    <TextBlock  Grid.Column="0" Text="{Binding warename}" Foreground="#FFFFD100" FontSize="20" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                                    <TextBlock  Grid.Column="1" Text ="{Binding count}" Foreground="#FF21FE00" FontSize="20" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                                    <local:ImageButton Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" Height="43" Width="112" Click="WareDesClk" BorderThickness="0">
                                        <local:ImageButton.Background>
                                            <ImageBrush ImageSource="Assets/btn_item_detail_n.png"/>
                                        </local:ImageButton.Background>
                                        <local:ImageButton.PressedBackground>
                                            <ImageBrush ImageSource="Assets/btn_item_detail_d.png"/>
                                        </local:ImageButton.PressedBackground>
                                    </local:ImageButton>                               
                                </Grid>
                            </DataTemplate>
                        </ListView.ItemTemplate>

    void TKLobby::HallPage::WareDesClk(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
     UserWare^ ware = LobbyInfo::Current->GetUserWareById(WareInfoList->SelectedIndex);//此时WareInfoList->SelectedIndex没有变化
    }

    2012年8月3日 3:20

答案

  • Hi,

    ListView.ItemTemplate中包含有Button的话,如果ListView的模式是Click即SelectionMode = None, IsItemClickEnabled  = True

    那么则会调用Button的Click事件以及ListView的ItemClick都会被调用,并且Click事件在ItemClick之前调用。这样通过传递的ClickItem属性则可以获取点击的是什么元素。或者也可以通过sender获得传递时间的ListView之后通过SelectedIndex获取选择的是第几行。

    但是SelectionMode=Single则会有些问题,ItemClick会触发前一个点击的元素。请问你为什么需要向下传递路由事件,不知道这个方案能不能解决你的问题?

    Hope this helps


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 lslemoon 2012年8月6日 13:43
    2012年8月6日 9:43
    版主
  • Hi,

    点击Button之后会先触发Click事件再触发ItemClick,而在Item其他区域只触发ItemClick。上面我也提到这点,可以用来判断点击的是否是Button,比如用一个Bool变量判断,实现是很容易的。但是IsItemClickEnable=true是不能改变的,因为只使用Button想要判断到底是ListView中的第几行非常困难估计也只能使用HitTest了,极其繁琐。所以需要ItemClick传进来是点击的第几个。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月7日 8:44
    版主

全部回复

  • Hi,

    ListView.ItemTemplate中包含有Button的话,如果ListView的模式是Click即SelectionMode = None, IsItemClickEnabled  = True

    那么则会调用Button的Click事件以及ListView的ItemClick都会被调用,并且Click事件在ItemClick之前调用。这样通过传递的ClickItem属性则可以获取点击的是什么元素。或者也可以通过sender获得传递时间的ListView之后通过SelectedIndex获取选择的是第几行。

    但是SelectionMode=Single则会有些问题,ItemClick会触发前一个点击的元素。请问你为什么需要向下传递路由事件,不知道这个方案能不能解决你的问题?

    Hope this helps


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 lslemoon 2012年8月6日 13:43
    2012年8月6日 9:43
    版主
  • 谢谢,搞定了

    2012年8月6日 13:43
  • 还是有些问题,希望实现的功能是只点击Button有效,但在ItemClick中使用ClickItem,是点击列表Item任何区域都有效。

    我希望使用向下传递路由事件,是希望在触发Button的Click事件中,能获取列表的正确焦点。

    2012年8月7日 1:46
  • Hi,

    点击Button之后会先触发Click事件再触发ItemClick,而在Item其他区域只触发ItemClick。上面我也提到这点,可以用来判断点击的是否是Button,比如用一个Bool变量判断,实现是很容易的。但是IsItemClickEnable=true是不能改变的,因为只使用Button想要判断到底是ListView中的第几行非常困难估计也只能使用HitTest了,极其繁琐。所以需要ItemClick传进来是点击的第几个。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月7日 8:44
    版主
  • 在button的click事件里:

       var item = (sender as Button).DataContext as ClassYouDefined;

       int index = listview.Items.IndexOf(item);  //获得所点击的Item的index

    搞定~~

    2013年8月14日 6:55