ItemsTemplateで自動生成されたコントロールの取得について

メイン画面にListViewを配置し、ItemsTemplateにListBoxを設定している。
ListViewには ObservableCollection<ListBoxViewModel>をバインドしている。
コメj理宇市ListBoxViewModelクラスは独自に作成したListBoxにバインドするためのViewModel

この状態で、ListBoxの項目を上下に移動させた場合に、移動させた項目の選択状態がなくなってしまうので、連続で上下に移動させることができない。

 <上下移動させたときの処理>
     int i = cardlist.Cards.IndexOf(card);
     if (i == 0) { break; }
     model.Card c = cardlist.Cards[i - 1];
     cardlist.Cards.Remove(card);
     cardlist.Cards.Insert(i-1, card);
     cardlist.SetSelectedIndex(i - 1);

そのため、ListViewから自動生成されたListBoxを取得し、SelectedIndexを再設定する方法を調べたところ、VisualTreeHelperを利用した素敵なメソッドを作られた方がいたので、なんとか実装できた。
(https://blog.xin9le.net/entry/2013/10/29/222336)
※クラス名を「DependencyObjectExtensions」から「VisualTreeHelperExtention」へ変更して利用している













始めはViewModelからViewを取得して、そこからコントロールを辿って・・・ということを考えていろいろと調べていたが、ViewModelからViewを取得するのはなかなかめんどくさそうだった。そもそもそんな必要なかったんだけど・・・。


viewModel.CardLists・・・ListViewにバインドしているObservableCollection<ListBoxViewModel>
ListBoxViewModel・・・ListBoxにバインドしているViewModelObservableCollection<CustomListBoxItem>

foreach (var cardlist in viewModel.CardLists)
{
    if (cardlist.Cards.Contains(card)) {
        // 入れ替え
        int i = cardlist.Cards.IndexOf(card);
        if (i == 0) { break; }
        model.Card c = cardlist.Cards[i - 1];
        cardlist.Cards.Remove(card);
        cardlist.Cards.Insert(i-1, card);
        cardlist.SetSelectedIndex(i - 1);

        // ListViewからVisualTreeHerlerを利用してCardListコントロールを取得し、SelectedIndexを設定する
        var controlCardLists = VisualTreeHelperExtention.Descendants<controls.CardList>(lstMainCardList);
        foreach (var ctlCardList in controlCardLists)
        {
            if (ctlCardList.GetBindingViewModel() == cardlist) {
                ctlCardList.GetMainList().SelectedIndex = ctlCardList.GetMainList().Items.IndexOf(card); break;
            }
        }
    };
}

0 件のコメント:

コメントを投稿

PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...