前提・実現したいこと
WPF(C#+XAML)でReactiveプログラミングの学習をしています。
Viewのボタンを押下するとModelの値が変更されてViewに表示されるようにしたいです。
発生している問題・エラーメッセージ
「若返る」ボタンを押してもViewの表示が変わりません。
Modelの値が変更されるのは確認できましたので、ViewModelかViewに問題があると推測しています。
ReactivePropertyの使い方をよく理解できていないのだと思います。
該当のソースコード
Person.cs
C#
1 public class Person : BindableBase 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 public int Age { get; set; } 6 7 public Person() 8 { 9 Id = 1; 10 Name = "ひろし"; 11 Age = 55; 12 } 13 14 public void Younger() 15 { 16 Age--; 17 } 18 19 public void Elder() 20 { 21 Age++; 22 } 23 }
MainWindowViewModel.cs
C#
1public class MainWindowViewModel : BindableBase 2 { 3 PersonViewModel personViewModel; 4 public PersonViewModel PersonViewModel 5 { 6 get { return personViewModel; } 7 set { SetProperty(ref personViewModel, value); } 8 } 9 10 public Person Person { get; set; } 11 12 public MainWindowViewModel() 13 { 14 Person = new Person(); 15 //PersonViewModelにPersonを渡しています 16 PersonViewModel = new PersonViewModel(Person); 17 } 18 }
PersonViewModel.cs
C#
1 public class PersonViewModel : BindableBase 2 { 3 public ReactiveProperty<int> Id { get; private set; } 4 public ReactiveProperty<string> Name { get; private set; } 5 public ReactiveProperty<int> Age { get; private set; } 6 7 Person Person; 8 9 public ReactiveCommand YoungerCommand { get; } 10 public ReactiveCommand ElderCommand { get; } 11 12 public PersonViewModel(Person person) 13 { 14 Person = person; 15 this.Id = Person.ObserveProperty(x => x.Id).ToReactiveProperty(); 16 this.Name = Person.ToReactivePropertyAsSynchronized(x => x.Name); 17 this.Age = Person.ToReactivePropertyAsSynchronized(x => x.Age); 18 19 YoungerCommand = new ReactiveCommand().WithSubscribe(Person.Younger); 20 ElderCommand = new ReactiveCommand().WithSubscribe(Person.Elder); 21 } 22 }
PersonView.xaml
xaml
1<Page x:Class="ReactivePractice.Views.PersonView" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 mc:Ignorable="d" 7 d:DesignHeight="450" d:DesignWidth="800" 8 Title="MainView"> 9 <Grid> 10 <Grid> 11 <Grid.RowDefinitions> 12 <RowDefinition Height="auto"/> 13 <RowDefinition Height="auto"/> 14 <RowDefinition Height="auto"/> 15 <RowDefinition Height="auto"/> 16 <RowDefinition Height="auto"/> 17 <RowDefinition Height="auto"/> 18 <RowDefinition Height="auto"/> 19 <RowDefinition Height="auto"/> 20 <RowDefinition Height="auto"/> 21 </Grid.RowDefinitions> 22 23 <TextBlock Grid.Row="0" Text="Id"/> 24 <TextBox Grid.Row="1" 25 Text="{Binding Id.Value, Mode=TwoWay, 26 UpdateSourceTrigger=PropertyChanged}"/> 27 28 <TextBlock Grid.Row="2" Text="Name"/> 29 <TextBox Grid.Row="3" Text="{Binding Name.Value, Mode=TwoWay, 30 UpdateSourceTrigger=PropertyChanged}"/> 31 32 33 <TextBlock Grid.Row="4" Text="Age"/> 34 <TextBox Grid.Row="5" Text="{Binding Age.Value, Mode=TwoWay, 35 UpdateSourceTrigger=PropertyChanged}"/> 36 37 <Button Grid.Row="6" Command="{Binding YoungerCommand}"> 38 <TextBlock Text="若返る"/> 39 </Button> 40 <Button Grid.Row="7" Command="{Binding ElderCommand}"> 41 <TextBlock Text="老いる"/> 42 </Button> 43 </Grid> 44 </Grid> 45</Page> 46
質問
どのような記述をすればModelの値の変更がViewに反映されるのか、教えていただければ幸いです。
補足情報(FW/ツールのバージョンなど)
Visual Studio 2019 Professional
.Net framework 4.6.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/01 23:28