将DataTemplate中的ComboBox SelectedItem设置为自身

时间:2017-11-09 13:25:59

标签: c# wpf binding

所以我在ComboBox中遇到SelectedItem的小问题。

首先,我有一个模板用于ComboBox中的项目。因为我想为每个项目显示一个Icon和一个文本。

<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>

如您所见,此模板来自DataType Person

现在,我在另一个DataTemplate中使用此ComboBox。 DataTemplate看起来像这样:

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

属性AllPersons是在公司工作的所有人员的列表。一个人有两个属性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; }
}

最后我想显示很多ComboBoxes(使用ItemsControl)。每个ComboBox代表一个人。但我希望能够转换人员。 SelectedItem应该是SelectedDepartment.Persons

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

所以基本上我想要的是将我的ComboBox的SelectedItem设置为本身所以SelectedItem =“{Binding}”。但ItemSource是另一个。它们只有相同的DataType

1 个答案:

答案 0 :(得分: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并不真正有用