C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 153 を表示中)
■88762 / )  Re[2]: DataGridのセルをUserControlにする
□投稿者/ Hongliang (705回)-(2018/09/25(Tue) 15:39:22)
前提条件。Windows 7, .NET 4.7.1。
まず、Rxを入れていない等で、一部コードを多少いじりました。
このコードぐらいなら意味は変わっていないと思います。
・ReactiveCollection -> ObservableCollection
・i:Interaction.Behaviors -> 削除
・ReactiveProperty -> INotifyPropertyChangedを実装した独自クラス
・ReactiveCommand -> ICommandを実装した独自クラス

また実行時例外になる部分もいじりました。
・各依存関係プロパティの定義部分で、new FrameworkPropertyMetadataの第1引数が
 文字列"VALUE"/"MIN"/"MAX"になってるのを、1/0/100に変更

それから多少の手抜きのために、
・SettingControlクラスは定義せず、直接MainWindowにDataGridを配置

さて、私の環境では問題なく、編集モードに入った際にNumericUpDown::OnValueChangedが発生しています。
// ただし、ValuePropertyの初期値(前述のMetadata第1引数)が数字文字列で、
// Setting::ValueをToStringした値と一致した場合を除く。
// この場合、UserControl_Loadedのvm.ValueText.Value = ctrl.Value.ToString()が同値のため、
// PropertyChangedイベントが発生せず、結果としてOnValueChangedも発生しません。

問題なのは、Settingオブジェクトとのバインディングができていないことです。
NumericUpDownはコードで自身のDataContextを設定しているため、
<local:NumericUpDown Min="{Binding Min}" Max="{Binding Max}" Value="{Binding Value}"/>
の3つのバインディングのソースは全てNumericUpDownViewModelになってしまっています。
// バインディングのエラーをトレースに出すように設定しているなら、
// NumericUpDownViewModelにValueというプロパティが存在していないというエラーが出力されます。

一般的かどうかは知りませんが、NumericUpDown内のバインディングにおいては、
自身ではなく、最上位子要素Grid辺りのDataContextで扱うようにすれば、
NumericUpDownへの外部からのバインディングと内部のバインディングを別々に扱えるようになります。

返信 編集キー/


管理者用

- Child Tree -