質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

5136閲覧

Xamarin.FormsでListViewのViewCellにボタンを配置したい。

roamschemer

総合スコア31

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2018/09/06 06:17

前提・実現したいこと

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 を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

MenuItemのコンストラクタで、InputDeleteSubscribeを行えばいいのではないでしょうか。

C#

1public class MenuItem 2{ 3 public string Title { get; set; } 4 public ReactiveProperty<string> Detail { get; set; } = new ReactiveProperty<string>(); 5 public ReactiveCommand Input { get; set; } = new ReactiveCommand(); 6 public ReactiveCommand Delete { get; set; } = new ReactiveCommand(); 7 8 public MenuItem() 9 { 10 Input.Subscribe(() => Detail.Value = "入力ボタンを押しました"); 11 Delete.Subscribe(() => Detail.Value = "消去ボタンを押しました"); 12 } 13}

投稿2018/09/06 06:52

編集2018/09/06 07:13
f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roamschemer

2018/09/06 08:04

成る程!認識が間違っていました。先にViewCellの中身を先に作っておいて、それをListViewで複製していくイメージな訳ですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問