2016-06-30 7 views
0

各セルに独自の画像があるListViewを作成しました。 イメージをクリックすると、myコマンドが実行され、ViewModelのメソッド "OpenImageAsync"に到達しましたが、SelectedItemは更新されません。常にNULLです。。 私はこのガイドに従うことを試みたが運がない。 http://rasmustc.com/blog/Image-Gallery-With-Xamarin-Forms/ViewCell内の画像のTapGestureはSelectedItemを更新しません

XAML

<ListView 
     x:Name="ListViewName" 
     ItemsSource="{Binding PollStatistics}" 
     SelectedItem="{Binding SelectedPollStatistic}"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
      <ViewCell> 
       <StackLayout> 
        <Image 
         Source="{Binding Image, Converter={StaticResource ByteArrayToImage}}"> 
         <Image.GestureRecognizers> 
         <TapGestureRecognizer 
          Command="{Binding Path=BindingContext.OpenImageCommand, Source={x:Reference EndPageContentPage}}" 
          CommandParameter="Image" /> 
         </Image.GestureRecognizers> 
        </Image> 
       </StackLayout> 
      </ViewCell> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
     </ListView> 

Xaml.cs

public partial class EndPage : BaseContentPage 
    { 
     public EndPage(INavigation navigation, User user) 
     { 
      InitializeComponent(); 
      this.BindingContext = new EndPageViewModel(navigation, user); 
     } 
    } 

ビューモデル

public class EndPageViewModel : BaseViewModel, IIsLoadSpinnerRunning 
    { 
     private readonly INavigation _navigation; 
     private readonly User _user; 
     private readonly PollStatisticManager _pollStatisticManager = PollStatisticManager.DefaultManager; 
     private ObservableCollection<PollStatisticDTO> _pollStatistics; 
     private PollStatisticDTO _selectedPollStatistic; 
     public EndPageViewModel(INavigation navigation, User user) 
     { 
      this._navigation = navigation; 
      this._user = user; 
      OpenImageCommand = new Command(async() => await OpenImageAsync()); 
      PollStatistics = await _pollStatisticManager.GetPollStatisticsForSessionAsync(sessionData); 
     } 
     public ObservableCollection<PollStatisticDTO> PollStatistics 
     { 
      get 
      { 
       return _pollStatistics; 
      } 
      set 
      { 
       _pollStatistics = value; 
       OnPropertyChanged("PollStatistics"); 
      } 
     } 
     public PollStatisticDTO SelectedPollStatistic 
     { 
      get 
      { 
       return _selectedPollStatistic; 
      } 
      set 
      { 
       _selectedPollStatistic = value; 
       OnPropertyChanged("SelectedPollStatistic"); 
      } 
     } 
     public ICommand OpenImageCommand { get; set; } 
     private async Task OpenImageAsync() 
     { 
      if (SelectedPollStatistic != null) 
      { 
       await _navigation.PushModalAsync(new ImageModalPage(_navigation, SelectedPollStatistic.Image)); 
      } 
     } 
    } 
+1

をあなたはおそらく 'CommandParameter'を利用するべきですそこにあります;) –

+0

CommandParameter = "{SelectedPollStatistic}をバインドしています"と同じですか? –

+0

わかりませんが、 'Mode = TwoWay'を試してみましたか? –

答えて

0

私は行動を使用:

namespace XamarinApp.Behaviors 
{ 
public class ListViewItemTappedBehavior : Behavior<ListView> 
{ 
    #region Bindable properties 
    public static readonly BindableProperty CommandProperty = 
     BindableProperty.Create(nameof(Command), 
           typeof(ICommand), 
           typeof(ListViewItemTappedBehavior), 
           default(ICommand)); 

    public ICommand Command 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 
    #endregion 

    protected override void OnAttachedTo(ListView listView) 
    { 
     base.OnAttachedTo(listView); 

     listView.ItemTapped += OnItemTapped; 
    } 

    protected override void OnDetachingFrom(ListView listView) 
    { 
     base.OnDetachingFrom(listView); 

     listView.ItemTapped -= OnItemTapped; 
    } 

    private void OnItemTapped(object sender, ItemTappedEventArgs e) 
    { 
     var listView = sender as ListView; 
     listView.SelectedItem = null; 

     if (Command != null && Command.CanExecute(e.Item)) 
     { 
      Command.Execute(e.Item); 
     } 
    } 
} 
} 


<ContentPage x:Name="Page" 
      xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:behaviors="clr-namespace:XamarinApp.Behaviors;assembly=XamarinApp"> 

     <ListView ItemsSource="{Binding Items}"> 
     <ListView.Behaviors> 
      <behaviors:ListViewItemTappedBehavior Command="{Binding BindingContext.NavigateToDetailsPageCommand, Source={x:Reference Page}}"/> 
     </ListView.Behaviors> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
      <ViewCell> 
       ... 
      </ViewCell> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
     </ListView> 
</ContentPage> 

CommandParameterは、アイテムをタップします。

0

ありがとう@EgorGromadskiyと@GeraldVersluis - 私はあなたのコードEgorを使用しませんでしたが、あなたはどちらもこれを解決する方法を見つけ出すのを助けました。

私が知りませんでしたが、CommandParameterは、ItemTappedイベントが発生していなくても、選択したアイテムのエンティティを認識していました。ジェラルドは述べたように は、だから私はCommandParameterの使用をしなければならなかった:

コマンドをViewModelに

public ICommand OpenImageCommand 
    { 
     get 
     { 
      return _openImageCommande ?? new Command<Guid>(async (itemId) => 
      { 
       SelectedPollStatistic = PollStatistics.Single(x => x.Id == itemId); 
       await OpenImageAsync(); 
      }); 
     } 
    } 

にXAML

<Image.GestureRecognizers> 
    <TapGestureRecognizer 
     Command="{Binding Path=BindingContext.OpenImageCommand, Source={x:Reference EndPageContentPage}}" 
     CommandParameter="{Binding Id}" /> 
</Image.GestureRecognizers> 
関連する問題