0

別のカスタム クラス (DoorControllerLabelInfo) の監視可能なコレクションを持つカスタム クラス (NewBlockLabelInfo) があります。NewBlockLabelInfo クラスをツリ​​ービューに正常にデータ バインドし、すべて正常に表示されます。

特定のプロパティにバインドされたデータであるテキストボックスがたくさんあり、これらを更新するとツリービューに反映されます。

プロパティのテキスト ボックスの 1 つのセットを、ツリービューで選択した項目にデータバインドしたい 選択した項目が指定したツリービュー項目 (監視可能なコレクション、ドア コントローラー) の子である場合

データ コンテキストは、ウィンドウ レベルで指定されます。

私はこれを行う方法を長い間懸命に探してきましたが、最良の方法は言うまでもありません。

TreeView の WPF XAML は次のとおりです。

<TreeView Margin="12,150,582,16" Name="treeView1">
            <TreeViewItem Header="{Binding Path=BlockName}" Style="{StaticResource BlockItem}" IsExpanded="True">
                <TreeViewItem Style="{StaticResource PhoneNoItem}" Header="{Binding Path=TelephoneNumber}"/>
                <TreeViewItem Style="{StaticResource DataNoItem}" Header="{Binding Path=DataNumber}"/>
                <TreeViewItem Style="{StaticResource CompanyItem}" Header="{Binding Path=CompanyName}"/>
                <TreeViewItem Style="{StaticResource ConnectedItem}" Header="{Binding Path=ConnectedDC}" />
                <TreeViewItem IsExpanded="True" Header="Door Controllers" Foreground="#FF585858" ItemsSource="{Binding Path=DoorControllers, UpdateSourceTrigger=PropertyChanged}" Name="DCTreeViewItem" Selected="DCTreeViewItem_Selected">
                    <TreeViewItem.ItemTemplate>
                        <HierarchicalDataTemplate>
                            <TreeViewItem Header="{Binding Path=DCName}" Style="{StaticResource DCItem}" IsExpanded="True" Selected="DCTreeViewItem_Selected" >
                                <TreeViewItem Header="{Binding Path=Address}" Style="{StaticResource AddressItem}" />
                                <TreeViewItem Header="{Binding Path=Channel1}" Style="{StaticResource Door1Item}" />
                                <TreeViewItem Header="{Binding Path=Channel2}" Style="{StaticResource Door2Item}" />
                            </TreeViewItem>
                        </HierarchicalDataTemplate>
                    </TreeViewItem.ItemTemplate>
                </TreeViewItem>
                <TreeViewItem IsExpanded="True" Header="Flats" Foreground="#FF585858" ItemsSource="{Binding Path=FlatNames, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
                    <TreeViewItem.ItemTemplate>
                        <DataTemplate>
                            <TreeViewItem Header="{Binding}" Style="{StaticResource FlatsItem}" IsExpanded="True">
                            </TreeViewItem>
                        </DataTemplate>
                    </TreeViewItem.ItemTemplate>
                </TreeViewItem>
            </TreeViewItem>
        </TreeView>

ドア コントローラー TreeViewItem の子である場合にのみ、テキスト ボックスを TreeViewItem の選択されたアイテム プロパティ (またはデータバインドされたクラス プロパティ) にバインドするにはどうすればよいですか?

事前にありがとう オリバー

4

2 に答える 2

0

関心のある子 TreeViewItems ごとにクリック時にイベント ハンドラーを追加することで、これを自分で解決しました。これにより、そこから DataContext を取得し、それを TextBox の DataContext に設定して、独自のバインディングを作成できます。

DataContext の取得は値ではなく参照によって行われるため、これは機能します。

子ノードの 1 つがクリックされたときのイベント ハンドラーは次のとおりです。

private void DCTreeViewItem_Selected(object sender, RoutedEventArgs e)
    {
        TreeViewItem currentItem = (TreeViewItem)e.OriginalSource;

        textBox5.DataContext = ((DoorControllerLabelInfo)currentItem.DataContext);

        Binding b = new Binding("DCName");
        b.Mode = BindingMode.TwoWay;
        b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

        BindingOperations.SetBinding(textBox5, TextBox.TextProperty, b);
    }

このことから、データ コンテキストのみを更新する必要があるように、XAML でパス、バインド モード、および更新元トリガーを設定します。

ありがとうオリバー

于 2011-07-12T10:06:06.710 に答える
0

おそらく、DataTemplate セレクターを定義し、いくつかのデータテンプレートを作成するのが最善でしょう。セレクターはあらゆる種類の論理ルールを評価し、必要なテンプレートを返すことができます。

これは、 DataTemplateSelectors に関する非常に優れた入門チュートリアルです。

編集

あなたの質問を読み直した後、ここに私が得たものがあります。

モデル クラスには、親オブジェクトにアクセスするためのナビゲーション プロパティがありますか? その場合、ViewModel でトリガー (MVVM を使用している場合はより望ましい) プロパティを使用して、親 TreeViewItem ではなく親オブジェクトに基づいて可視性を有効/無効/変更できます。あなたが説明している方法でビジュアルツリーにアクセスするのは少し難しいです。

于 2011-07-11T14:04:51.617 に答える