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

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

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

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

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

8030閲覧

ComboBoxのSelectedItemを参照するReactiveProperty<Visibility>が反映されない

doranign

総合スコア5

C#

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

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2020/08/25 09:18

前提・実現したいこと

WPFでMVVM(素のWPF+ReactiveProperty)に挑戦しています。
ComboBoxのSelectedItemの値に応じてVisibilityを変動させたいと思い、以下のようなコードを組みました。

  • Model.cs

csharp

1 public class Fruits : BindableBase 2 { 3 public ReactiveCollection<Fruit> FruitsList 4 => new ReactiveCollection<Fruit>() 5 { 6 new Fruit() { Name = "Apple", Price = 100 }, 7 new Fruit() { Name = "Orange", Price = 130 }, 8 new Fruit() { Name = "Peach", Price = 200 }, 9 }; 10 11 private Fruit selectedFruit; 12 public Fruit SelectedFruit { 13 get { return selectedFruit; } 14 set { this.SetProperty(ref selectedFruit, value); } 15 } 16 17 public class Fruit 18 { 19 public string Name { get; set; } 20 public int Price { get; set; } 21 22 // Bind時の表示項目 23 public override string ToString(){ 24 return this.Name; 25 } 26 } 27 }
  • MainWindowViewModel.cs

csharp

1public class MainWindowViewModel : BindableBase 2{ 3 public ReadOnlyReactiveCollection<Fruits.Fruit> FruitsList { get; } 4 public ReactiveProperty<Fruits.Fruit> SelectedFruit { get; } 5 6 public ReactiveProperty<Visibility> AppleSelected { get; set; } 7 8 public MainWindowViewModel() 9 { 10 var fruits = new Fruits(); 11 12 FruitsList = fruits.FruitsList.ToReadOnlyReactiveCollection(); 13 14 SelectedFruit = fruits.ToReactivePropertyAsSynchronized(x => x.SelectedFruit); 15 16 AppleSelected = SelectedFruit.Select(x => x.Name == "Apple" ? Visibility.Visible : Visibility.Collapsed) 17 .ToReactiveProperty(Visibility.Collapsed); 18 } 19}
  • MainWindow.xaml

xaml

1<StackPanel Margin="5"> 2 <TextBlock Text="好きなフルーツは?"/> 3 <ComboBox ItemsSource="{Binding FruitsList}" 4 SelectedItem="{Binding SelectedFruit.Value, Mode=TwoWay}"/> 5 <TextBlock x:Name="Select" Text="{Binding SelectedFruit.Value}"/> 6 <TextBlock x:Name="ShowWhenSelectApple" Text="Apple選択時のみ表示したい" Visibility="{Binding AppleSelected.Value}"/> 7</StackPanel>

発生している問題・エラーメッセージ

実際に動かすとComboBoxで選択した項目名がSelectに反映されることは確認できますが、
「Apple」を選んでも表示されるはずのShowWhenSelectAppleが表示されません。

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

手元ではx => x.Name == "Apple"x.で、NullReferenceExceptionがでます。
x?.に変えると想定通り動くと思うのですが。

例外設定でNullReferenceExceptionを中断しない設定にされていますか?

投稿2020/08/25 10:04

TN8001

総合スコア9862

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

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

doranign

2020/08/25 10:21

確認したところ、仰る通りNullReferenceExceptionで中断しない設定になっておりました…。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問