2017-11-09 18 views
-1

したがって、ComboBoxにSelectedItemの小さな問題があります。DataTemplateのComboBox SelectedItemを自分自身に設定する

まず、ComboBox内のアイテムに使用するテンプレートがあります。なぜなら、すべてのItemに対してアイコンとテキストを表示したいからです。

<DataTemplate x:Key="PersonsComboBox" DataType="asi:Person"> 
    <WrapPanel> 
     <StackPanel Orientation="Horizontal"> 
      <Image Width="40" Height="30" Source="{Binding Path=Symbol, Converter={StaticResource ImageConverter}}" /> 
      <vw:Label Content="{Binding Name}" /> 
     </StackPanel> 
    </WrapPanel> 
</DataTemplate> 

ご覧のとおり、このテンプレートはデータタイプPersonに由来しています。

今、このComboBoxを別のDataTemplateで使用します。 DataTemplateを、次のようになります。

<DataTemplate x:Key="PersonsTemplate" DataType="asi:Person"> 
    <vw:ComboBox ItemTemplate="{StaticResource PersonsComboBox}" ItemsSource="{Binding AllPersons}" SelectedItem="???"> 
</DataTemplate> 

プロパティAllPersonsが会社で働くすべての人のリストです。人物には2つの属性NameSymbol(顔の画像)があります。

AllPersons = new List<Person> 
{ 
    new Person { Name = "Jenny", Symbol = new Image.FromFile("Path") }, 
    new Person { Name = "Mike", Symbol = new Image.FromFile("Path") } 
    new Person { Name = "Peter", Symbol = new Image.FromFile("Path") } 
    new Person { Name = "Nicole", Symbol = new Image.FromFile("Path") } 
} 

人:私はコンボボックスの多くを表示したい終わり

public class Person 
{ 
    public string Name { get; set; } 

    public Image Symbol { get; set; } 
} 

(ItemsControlにを使用して)。各ComboBoxは人を表します。しかし私は人を切り替えることができるようにしたい。 SelectedItemだから基本的に私が欲しいものSelectedDepartment.Persons

<StackPanel> 
    <ItemsControl ItemsSource="{Binding SelectedDepartment.Persons, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemTemplateSelector="{StaticResource PersonTemplateSelector}"/> 
</StackPanel> 

の項目でなければなりませんのSelectedItem =「{バインディング}」ので、それ自体であることを私のコンボボックスののSelectedItemを設定することです。しかし、ItemSourceは別のものです。彼らはちょうど同じデータ型を持っています

+0

本当に便利ではありませんActionクラスは、アクションのプロパティを持っていますか?あなたのクラス定義を投稿してください。 – mm8

+0

それ自体は 'DataContext'ですか? 'SelectedItem =" {Binding} "は動作するかどうか(OneWay/OneTimeバインディングの可能性が高いでしょうか?私の推測では、単純に 'Action'で' Equals() 'をオーバーライドする必要があります。 – Sinatr

+0

@ mm8質問を更新して、私が意味することをもっと分かりやすくしました – user2877820

答えて

0

人の選択を別のビューモデルでサポートするようにデータを再設計することをお勧めします。

class MultiplePeopleContainer 
{ 
    public ICollection<Person> AllPersons { get; } // list of all selectable person objects 

    public ICollection<PersonContainer> DisplayedPersons { get; } // list of displayed persons where the actual person can be selected from combobox 
} 

class PersonContainer 
{ 
    public Person SelectedPerson { get; set; } // person whos properties should be displayed 
} 

class Person 
{ 
    public string Name { get; set; } 

    public Image Symbol { get; set; } 
} 

その後、XAMLは非常に簡単

<!-- same as in question--> 
<DataTemplate x:Key="PersonsComboBox" DataType="asi:Person"> 
    <WrapPanel> 
     <StackPanel Orientation="Horizontal"> 
      <Image Width="40" Height="30" Source="{Binding Path=Symbol, Converter={StaticResource ImageConverter}}" /> 
      <vw:Label Content="{Binding Name}" /> 
     </StackPanel> 
    </WrapPanel> 
</DataTemplate> 

<!-- new --> 
<DataTemplate DataType="asi:MultiplePeopleContainer"> 
    <Grid> 
     <Grid.Resources> 
      <CollectionViewSource x:Key="SelectablePersons" Source="{Binding AllPersons}"/> 

      <DataTemplate DataType="asi:PersonContainer"> 
       <vw:ComboBox ItemTemplate="{StaticResource PersonsComboBox}" ItemsSource="{Binding Source={StaticResource SelectablePersons}" SelectedItem="{Binding SelectedPerson}" /> 
      </DataTemplate> 
     </Grid.Resources> 

     <ItemsControl ItemsSource="{Binding DisplayedPersons}"/> 
    </Grid> 
</DataTemplate> 

サイドノート次のようになります。<WrapPanel>PersonsComboBoxでテンプレート

関連する問題