0

以下にリストされているアプリケーションの 1 つに実装する要件があります。WPFでこれを実現する方法について質問があります。

  1. 左側のツリー ビューと、いくつかのテキスト ボックスとコンボ ボックス、右側のチェック ボックスを含むフォームに分割されたメインの WPF ウィンドウがあります。

  2. 右側のフォームに、ツリー ノードのタグ値に格納されているオブジェクトのそれぞれの値を入力したいと考えています。

  3. ツリー ビューで特定のノードをクリックすると、右側のフォーム フィールドのタグ値にオブジェクト ストアの内容が表示され、右側のフォーム フィールドに変更を加えると最終的に更新されます。

誰でもサンプル アプリケーションへのリンクを提供できますか?

4

1 に答える 1

0

あなたの質問は、 (Data) Bindingである WPF の非常に基本的な概念に関連しています。この記事から始めてください。

興味深い/編集可能なオブジェクトを のTagプロパティに配置TreeViewItemすることは、UI 設計にとって非常に悪い考えであることに注意してください。プロパティはコードから簡単にアクセスできますTagが、UI からバインドするのは非常に困難/複雑になります。TreeViewSelectedItem/SelectedIndexTreeViewItems

この例で遊んでください:

<StackPanel Orientation="Horizontal">
    <TreeView x:Name="twi">
        <TreeViewItem Tag="one" Header="111">
            <TextBlock Text="First" />
        </TreeViewItem>
        <TreeViewItem Tag="two" Header="222">
            <TextBlock Text="Second" />
        </TreeViewItem>
        <TreeViewItem Tag="three" Header="333">
            <TextBlock Text="Third" />
        </TreeViewItem>
    </TreeView>
    <StackPanel Orientation="Vertical">
        <TextBlock Text="The text:" />
        <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem}" />
        <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag}" />
        <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag.Name}" />
        <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag.Surname}" />
    </StackPanel>
</StackPanel>

これはサンプル全体です。どこにでも置いてください。左側にアイテム、右側にいくつかのラベルがあります。TreeView をクリックすると、ラベルが更新され、選択されているものとそのTagプロパティが表示されます。もちろん、TAG は単純な文字列に設定されているため、.Name と .Surname には何も表示されません。ただし、一部のデータ オブジェクトに TAG を設定すると、正しく表示されます。TWI をクリックすると期待どおりの結果が得られることに注意してください。ただし、TWI の子をクリックすると、そうはなりません。つまり、子テキストが選択されているのです。

ツリービューに何を配置するか、およびタグの値を何/どこに配置するかについて非常に注意する必要があります。これは良い方法ではありません。より一般的には、次のようにします。

public class Person
{
    // properties
    public string Name { .... }
    public string Surname { ... }

    public List<Person> Subordinates { .... }
}

<StackPanel Orientation="Horizontal">
    <TreeView x:Name="twi">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Subordinates}">
                <TextBlock>
                    <Run Text="{Binding Name}" />
                    <Run Text=" " />
                    <Run Text="{Binding Surname}" />
                </TextBlock>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

    <StackPanel Orientation="Vertical">
        <TextBlock Text="The selected person:" />
        <TextBox Text="{Binding ElementName=twi, Path=SelectedItem.Name, Mode=TwoWay}" />
        <TextBox Text="{Binding ElementName=twi, Path=SelectedItem.Surname, Mode=TwoWay}" />
    </StackPanel>
</StackPanel>

そしてもちろん、いくつかのサンプル データを作成し、それをその ItemsSource として treeView に提供します。このように、TreeView はアイテムを自動的に作成し、テンプレートを適用し、クリックするたびに、SelectedItem はTreeViewItems ではなく、Person直接編集可能な を提供します。したがって、ウィンドウの右側では、単純な へのバインドSelectedItem.Nameが「そのまま機能」し、2 方向にすると、Person が直接更新されます。

免責事項: 私はコードを実行していません。バグやタイプミスがあるかもしれません。コードは、一般的なアイデアを示すためのものです。

于 2012-09-03T10:07:26.100 に答える