如何将listviewitem中的按钮绑定到Winrt中的ViewModel中的Command

时间:2013-10-28 22:45:48

标签: c# mvvm winrt-xaml

我在ViewModel中有一个 NavigateToAccountsCommand RelayCommand属性。当我将相同的页面上的按钮绑定到ListView外的任何位置时,命令绑定正在运行。但是,只要我将其移动到ListView的DataTemplate,它就无法正常工作。

我已尝试将绑定从 NavigateToAccountsCommand 更改为 DataContext.NavigateToAccountsCommand 仍无效。

感谢您的帮助......

<Page
x:Class="FinancePRO.App.Views.AccountsView"
DataContext="{Binding AccountsViewModel, Source={StaticResource MainViewModelLocator}}"
mc:Ignorable="d">

<Grid>
      <!--**This one is working**-->
      <Button  Command="{Binding NavigateToAccountsCommand}" >

     <!--**This one is not working**-->
        <ListView ItemsSource="{Binding AllAccounts}" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel HorizontalAlignment="Stretch">
                      <TextBlock Text="{Binding AccountName}"/>
                      <Button  Command="{Binding NavigateToAccountsCommand}">
                                </Button>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

3 个答案:

答案 0 :(得分:12)

当您在DataTemplate的{​​{1}}内时,您的数据上下文是ListView的ListView的当前项。由于在ItemsSource'每个单独元素中没有任何名为“NavigateToAccountsCommand”的属性,因此绑定无效。

要解决此问题,您需要引用AllAcounts外部的内容;以下应该工作。它更改绑定以引用应该可以访问属性DataTemplate的根网格DataContext。要引用网格,您必须添加Name属性,然后使用NavigateToAccountsCommand绑定。

ElementName

答案 1 :(得分:3)

您可以使用

<Button x:Name="cmdTabItemCloseButton" 
                                Style="{StaticResource TabItemCloseButtonStyle}"
                                Grid.Column="1" Margin="15,0,0,0"
                                Command="{Binding RelativeSource=
                {RelativeSource FindAncestor, 
                AncestorType={x:Type ListView}}, 
                Path=DataContext.NavigateToAccountsCommand}"
                                CommandParameter="{Binding}"/>

答案 2 :(得分:-1)

我有一个类似的问题(Win RT),我通过使用:

解决了
    <GridView
        x:Name="itemGridView"
        ItemClick="ItemView_ItemClick"
        IsItemClickEnabled="True"/>

然后在Page class:

    private void ItemView_ItemClick(object sender, ItemClickEventArgs e)
    {
        //e is the object being clicked
    }