回答編集履歴
2
Dt4A
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
ラップ例追加
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
|
-
|
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)
|