1namespace Test
2{3 public partial class TestControl : UserControl
4{5 public TestControl()6{7InitializeComponent();8 baseContainer.DataContext = new MainViewModel(this);// vmにvを渡す9}1011 public static readonly DependencyProperty InfoListProperty = DependencyProperty.Register(12"InfoList",// プロパティ名を指定13typeof(List<Info>),// プロパティの型を指定14typeof(TestControl),// プロパティを所有する型を指定15 new PropertyMetadata(null, MyPropertyChangedHandler)16);1718 private staticvoidMyPropertyChangedHandler(DependencyObject sender, DependencyPropertyChangedEventArgs args)19{20 TestControl that =(TestControl)sender;21 MainViewModel vm =(MainViewModel)that.baseContainer.DataContext;22 vm.ListUpdate((List<Info>)args.NewValue);// v->vmへの通知23}2425 public List<Info> InfoList
26{27 get {return(List<Info>)GetValue(InfoListProperty);}28 set {SetValue(InfoListProperty, value);}// vm->vへの通知29}30}31}
ありがとうございます。MVVMに不慣れなためこちらの情報が的確ではなく申し訳ないです。
設計思想は以下になります。
UserControlはTreeViewのみです。専用のデータとセットにして使いまわせるようにコントロール化をしました。データの実体はモデル部より供給しTreeViewで表示します。アプリではTreeViewの各行のCheckBoxの状態を設定値として供給・保存をしています。
データの流れはこんな感じです。
check状態(開始時) App --> UserControl v --> vm --> model
check状態(終了時) App <-- UserControl v <-- vm <-- model
ツリー構造の実体 UserControl v <-- vm <-- model
TreeViewのチェックBoxは、親ノードをチェックすると子ノードもチェックを入れるUIにしています。アプリが設定として必要なのはチェックを入れた最上位の情報だけです。そのためUserControl内で必要な情報を抽出してList構造にしています。それがソース上の List<Info>です。
ありがとうございます。
ModelをMainWindow側で持っている感じなのですね。いろいろなテクニックは参考になります。xamlに関する知識不足なのでじっかり読み解いていきます。
考えていたのは、MainWindow側はツリービューの選択状態の情報のみを設定値として持ち、usercontrol内がTreeViewを使用している事も認識していません。ちょっと一般的な使い方ではないのでしょうか。
check状態(開始時) App --> UserControl v --> vm --> model
check状態(終了時) App <-- UserControl v <-- vm <-- model
ツリー構造の実体 UserControl v <-- vm <-- model