1

モデルクラスのPersonとそれを表示するUserControlPersonComboBoxItemがあります。

私がやりたいのは、ComboBoxItemsSourceがObservableCollection<Person>呼び出されたPeopleにバインドされる場所を作成し、PersonUserControlを使用してコレクション内の各Personを表示することです。

<Grid>
    <ComboBox SelectedIndex="0" ItemsSource="{Binding People}" >            
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <local:PersonComboBoxItem Person="{Binding ###how do I get the current item here to set the property 'Person' on my PersonComboBoxItem class? ###  }"  />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</Grid>

私はすでにmsdnでのデータバインディングに関するこのすばらしい記事を読み進めましたが、設計アプローチに移行することができませんでした。気軽に批判してください。これがWPFの方法であるかどうかは、わかりません。

よろしく、フロリアン

PS:私のサンプルコードはここからダウンロードできます。

4

2 に答える 2

2

暗黙的に使用して、ビジュアルツリーでオブジェクトに遭遇したときにオブジェクトDataTemplateを描画する方法をWPFに指示するだけです。Person

<Grid>
    <ComboBox SelectedIndex="0" ItemsSource="{Binding People}" DisplayMemberPath="Name">            
        <ComboBox.Resources>
            <DataTemplate DataType="{x:Type local:Person}">
                <local:PersonComboBoxItem />
            </DataTemplate>
        </ComboBox.Resources>
    </ComboBox>
</Grid>

ComboBoxすでにPersonデータオブジェクトをに配置しておりVisualTree、おそらく次のようになります。

<StackPanel>
    <ContentPresenter>
        <Person />
    </ContentPresenter>
    <ContentPresenter>
        <Person />
    </ContentPresenter>
    <ContentPresenter>
        <Person />
    </ContentPresenter>
    ...
</StackPanel>

つまり、単にそれが言うところ <Person />を。に置き換えているだけです<local:PersonComboBoxItem />DataContextあなたののもあなたのオブジェクトUserControlに設定されますPerson

また、のDataContextPersonItemComboBox常にタイプであるため、依存関係プロパティPersonも必要ありません。Person

于 2012-04-12T15:34:20.673 に答える
2

DataContextItemTemplate現在のPersonであり、に直接バインドするため、DataContextしたがって、を使用するPersonだけ{Binding}です。

プロパティの代わりにUserControlcurrentを直接使用するように設計することができ、明示的に何も設定する必要はありません。DataContextPerson

于 2012-04-12T15:34:56.257 に答える