Как привязать кнопку в listviewitem к команде в ViewModel в Winrt

У меня есть NavigateToAccountsCommand свойство RelayCommand в ViewModel. Когда я привязываю то же самое к кнопке на странице в любом месте за пределами ListView, привязка команды работает. Однако, как только я перемещаю это в DataTemplate ListView, он не работает.

Я попытался изменить привязку с NavigateToAccountsCommand to 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 ответов


когда вы находитесь внутри DataTemplate на ListView, ваш контекст данных является текущим элементом ItemsSource. Как там ничего не называется"NavigateToAccountsCommand" свойство в ваш AllAcounts' каждый отдельный элемент, привязка не работает.

чтобы исправить это, вам нужно будет ссылаться на что-то извне DataTemplate; следующее должно работать. Он изменяет привязку для ссылки на корневую сетку DataContext который должен иметь свойство NavigateToAccountsCommand работает. Для ссылки на сетка, вы должны добавить атрибут Name, а затем использовать ElementName привязка.

    <Grid Name="Root">
          <!--**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 ElementName=Root, Path=DataContext.NavigateToAccountsCommand}">
                                    </Button>
                    </DataTemplate>
                </ListView.ItemTemplate>
        </ListView>
   </Grid>

можно использовать

<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}"/>

у меня была аналогичная проблема (Win RT), которую я решил, просто используя:

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

а затем в классе страницы:

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