0

Silverlightアプリケーションの背後にあるコードでは、TreeViewを再入力してから、特定のTreeViewItemを選択する必要があります。

コード自体は非常に単純です。ここにあります(可能な限り短くするために、トリミングして擬似コード化します

private void Button_Click()
{
    Guid idToSelect = TellMeWhatToSelect();
    List<myObject> myDataList = myObjectRepository.RetrieveData().ToList();

    myTreeView.Items.Clear();
    foreach(myObject o in myDataList)
    {
        myTreeView.Items.Add(new TreeViewItem() { Content = o.DataField, Tag = o.Id });
    }

    myTreeView.Items.First(o => ((Guid)(o as TreeViewItem).Tag).Equals(idToSelect)).IsSelected = true;

}

基本的にはそれだけです。データを読み込んmyDataListでから、それを循環してTreeViewItem、データを表示するために必要な数のデータを作成します。

問題は、myTreeView.SelectedItemこれの最後でnullであり、SelectionChangedイベントがトリガーされないことです。Itemsコレクションがクリアされて再入力されたので、アイテムの1つをオンにすると、クリックしたように動作すると思いますIsSelectedが、そうではないようです)。

奇妙なことに(少なくとも私にとっては)、myTreeView.Items.First().IsSelected = true;それ自体で発行する(つまり、その1行のコードを内部に持つメソッドを呼び出す)ことは期待どおりに機能SelectedItemします。

コードの何が問題になっていますか、および/または何が欠けていますか?アイテムを掃除することは何かを壊すようなもののように見えます。

他の人も同様の問題を抱えていると確信していますが、私が試した一連の検索は役に立ちませんでした(私が思いついた情報と質問のほとんどはWPF関連です)。

お時間をいただきありがとうございます。必要に応じて詳細をお知らせします。また、テキストの壁をお詫び申し上げます。

アップデート

このようにコードを変更すると、メソッドは期待どおりに機能するようになります。

private void Button_Click()
{
    Guid idToSelect = TellMeWhatToSelect();
    List<myObject> myDataList = myObjectRepository.RetrieveData().ToList();

    myTreeView.Items.Clear();
    foreach(myObject o in myDataList)
    {
        myTreeView.Items.Add(new TreeViewItem() { Content = o.DataField, Tag = o.Id });
    }

    Dispatcher.BeginInvoke(()=>
    {        
        myTreeView.Items.First(o => ((Guid)(o as TreeViewItem).Tag).Equals(idToSelect)).IsSelected = true;
    });
}
4

2 に答える 2

1

Dispatcher.BeginInvokeIsSelected内でプロパティを設定します。

于 2012-04-11T12:42:35.833 に答える