前提・実現したいこと
Xamarin.FormsでListViewのViewCellにボタンを配置したい。
発生している問題・エラーメッセージ
一度ListViewをクリックしないと、同List内のButtonが反応しない。ListViewをクリックせずともButtonを押したら反応させたい。
該当のソースコード
Xaml
1<?xml version="1.0" encoding="utf-8" ?> 2<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 3 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 4 xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 5 prism:ViewModelLocator.AutowireViewModel="True" 6 x:Class="Test.Views.ListViewTest" 7 Title="登録"> 8 9 <StackLayout> 10 <ListView CachingStrategy="RecycleElement" ItemsSource="{Binding ListView}" SelectedItem="{Binding SelectItem.Value}" > 11 <ListView.ItemTemplate> 12 <DataTemplate> 13 <ViewCell> 14 <Grid> 15 <Grid.ColumnDefinitions> 16 <ColumnDefinition Width="*" /> 17 <ColumnDefinition Width="3*" /> 18 <ColumnDefinition Width="*" /> 19 <ColumnDefinition Width="*" /> 20 </Grid.ColumnDefinitions> 21 <Label Grid.Column="0" TextColor="Pink" 22 Text="{Binding Title}" /> 23 <Label Grid.Column="1" HorizontalTextAlignment = "End" 24 Text="{Binding Detail.Value}" /> 25 <Button Grid.Column="2" Text="入力" 26 Command="{Binding Input}" /> 27 <Button Grid.Column="3" Text="消去" 28 Command="{Binding Delete}" /> 29 </Grid> 30 </ViewCell> 31 </DataTemplate> 32 </ListView.ItemTemplate> 33 </ListView> 34 </StackLayout> 35 36</ContentPage>
C#
1using Prism.Mvvm; 2using Reactive.Bindings; 3using System; 4using System.Linq; 5using System.Reactive.Linq; 6 7namespace Test.ViewModels 8{ 9 public class ListViewTestViewModel : BindableBase 10 { 11 12 public class MenuItem 13 { 14 public string Title { get; set; } 15 public ReactiveProperty<string> Detail { get; set; } = new ReactiveProperty<string>(); 16 public ReactiveCommand Input { get; set; } = new ReactiveCommand(); 17 public ReactiveCommand Delete { get; set; } = new ReactiveCommand(); 18 } 19 20 public ReactiveCollection<MenuItem> ListView { get; set; } = new ReactiveCollection<MenuItem>(); 21 public ReactiveProperty<MenuItem> SelectItem { get; set; } = new ReactiveProperty<MenuItem>(); 22 23 public ListViewTestViewModel() 24 { 25 26 ListView = new ReactiveCollection<MenuItem>(); 27 foreach (var i in Enumerable.Range(1, 1000)) 28 { 29 ListView.Add(new MenuItem { Title = $"No.{i.ToString("00000")}"}); 30 } 31 //LinQで書きたいが失敗した 32 //ListView = Enumerable.Range(1, 1000).Select(x => new MenuItem { Title = $"No.{x.ToString("00000")}" }).ToList(); 33 34 SelectItem.Where(x => x != null).Subscribe(x => 35 { 36 x.Detail.Value = "リストを押しました"; 37 //一度はリストで選択した事のあるボタンしか反映しない…まぁ当然ではあるがどうすればいいのかはわからない。 38 x.Input.Subscribe(y => x.Detail.Value = "入力ボタンを押しました"); 39 x.Delete.Subscribe(y => x.Detail.Value = "消去ボタンを押しました"); 40 }); 41 42 } 43 } 44} 45
試したこと
上記コードまで仕上げましたが症状は前述のとおりです。コメントのある位置で修正できるとは思うのですが…
補足情報(FW/ツールのバージョンなど)
ReactiveProperty を使用しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/06 08:04