回答編集履歴

2

Dt4A

2022/12/14 02:21

投稿

TN8001
TN8001

スコア9317

test CHANGED
@@ -8,7 +8,7 @@
8
8
  `TextBox`の`TextChanged`を、ビヘイビアで呼び出すことは可能です(`Dt3`)
9
9
 
10
10
 
11
- あるいは`Data.A`をラップするのも、ひとつの手かなと思います(`Dt4`)
11
+ あるいは`Data.A`をラップするのも、ひとつの手かなと思います(`Dt4A`)
12
12
 
13
13
 
14
14
  .NET6です^^

1

ラップ例追加

2022/12/09 21:52

投稿

TN8001
TN8001

スコア9317

test CHANGED
@@ -1,11 +1,15 @@
1
1
  > Dt.Aプロパティが更新されたタイミングで処理がしたい。
2
2
 
3
3
  `Data`のほうを(も)`INotifyPropertyChanged`にすることはできないんでしょうか?
4
- そうすれば`ViewModel`側で変更をリッスンできますが...
4
+ そうすれば`ViewModel`側で変更をリッスンできますが...(`Dt2`)
5
5
 
6
6
  > setterで処理をするアプローチをいったん捨てる必要があるかと思っています。
7
7
 
8
- `TextBox`の`TextChanged`を、ビヘイビアで呼び出すことは可能です
8
+ `TextBox`の`TextChanged`を、ビヘイビアで呼び出すことは可能です(`Dt3`)
9
+
10
+
11
+ あるいは`Data.A`をラップするのも、ひとつの手かなと思います(`Dt4`)
12
+
9
13
 
10
14
  .NET6です^^
11
15
  ```xml
@@ -43,6 +47,11 @@
43
47
  </behaviors:Interaction.Triggers>
44
48
  </TextBox>
45
49
  </HeaderedContentControl>
50
+
51
+ <!-- Dt.Aでのバインドをあきらめてラップする -->
52
+ <HeaderedContentControl Header="Dt4A">
53
+ <TextBox Text="{Binding Dt4A, UpdateSourceTrigger=PropertyChanged}" />
54
+ </HeaderedContentControl>
46
55
  </StackPanel>
47
56
  </Window>
48
57
  ```
@@ -77,14 +86,29 @@
77
86
  //}
78
87
 
79
88
  public Data2 Dt2 { get; } = new Data2();
89
+
80
90
  public Data Dt3 { get; } = new Data();
91
+
92
+ // Dt.Aでのバインドをあきらめてラップする
93
+ // [ObservableObject - .NET Community Toolkit | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/communitytoolkit/mvvm/observableobject#wrapping-a-non-observable-model)
94
+ private readonly Data dt4 = new Data();
95
+ public string? Dt4A
96
+ {
97
+ get => dt4.A;
98
+ set
99
+ {
100
+ if (SetProperty(dt4.A, value, dt4, (d, a) => d.A = a))
101
+ {
102
+ Debug.WriteLine($"Dt4A setter:{dt4.A}");
103
+ }
104
+ }
105
+ }
81
106
 
82
107
  public ViewModel() => Dt2.PropertyChanged += Dt2_PropertyChanged;
83
108
 
84
109
 
85
110
  // 呼ばれることはない
86
- partial void OnDtChanged(Data value)
87
- => Debug.WriteLine($"OnDtChanged:{Dt.A}");
111
+ partial void OnDtChanged(Data value) => Debug.WriteLine($"OnDtChanged:{Dt.A}");
88
112
 
89
113
  private void Dt2_PropertyChanged(object? sender, PropertyChangedEventArgs e)
90
114
  => Debug.WriteLine($"Dt2_PropertyChanged:{Dt2.A}");
@@ -96,8 +120,7 @@
96
120
  //public IRelayCommand InvokeCommand => invokeCommand ??= new RelayCommand(Invoke);
97
121
 
98
122
  // 直接メソッドも呼べる
99
- public void CallMethod()
100
- => Debug.WriteLine($"CallMethod:{Dt3.A}");
123
+ public void CallMethod() => Debug.WriteLine($"CallMethod:{Dt3.A}");
101
124
 
102
125
  // sender・argsも取れるが、System.Windows.Controlsに依存はさすがに気持ち悪い
103
126
  public void CallMethod2(object sender, TextChangedEventArgs e)