前提・実現したいこと
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が表示されません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/25 10:21