首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法让ItemTemplateSelector正常工作

无法让ItemTemplateSelector正常工作
EN

Stack Overflow用户
提问于 2017-03-07 23:45:25
回答 2查看 328关注 0票数 2

在WPF项目中,我有一个可以从不同对象中选择的ComboBox。使用ItemsControl和它的ItemTemplateSelector,我试图根据对象的属性为ComboBox选择显示不同的UI。因此,在下面的示例中,我们从person对象中进行选择。在ItemTemplateSelector中,我们根据PersonIsManager属性选择一个不同的DataTemplate,问题是它不能工作。

我怀疑这可能是因为ItemsControlItemsSource绑定到了一个项目,但不确定?如果这就是问题所在,有没有人能建议我如何修改代码或者用其他方式来实现上面的功能呢?

在此之前,非常感谢您。

XAML:

代码语言:javascript
复制
<Window x:Class="ItemsSelector.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ItemsSelector"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <Grid.Resources>
        <local:Selector x:Key="selector"/>

        <DataTemplate x:Key="managerTemplate">
            <TextBlock Text="Manager"/>
        </DataTemplate>

        <DataTemplate x:Key="juniorTemplate">
            <TextBlock Text="Junior"/>
        </DataTemplate>

    </Grid.Resources>

    <ComboBox x:Name="cbo" Margin="2" Grid.Row="0" ItemsSource="{Binding .}" SelectedIndex="0">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

    <ItemsControl Grid.Row="1" ItemTemplateSelector="{StaticResource selector}" ItemsSource="{Binding ElementName=cbo ,Path=SelectedItem}">

    </ItemsControl>
</Grid>

代码隐藏:

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = new Person[] {
            new Person() { Name = "Boss", IsManager = true },
            new Person() { Name = "Underling", IsManager = false }
        };
    }
}

人员:

代码语言:javascript
复制
public class Person
{
    public string Name { get; set; }
    public bool IsManager { get; set; }
    public string Title { get; set; }
}

选择器:

代码语言:javascript
复制
public class Selector : DataTemplateSelector
{
    public override DataTemplate
        SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null && item is Person)
        {

            var person = item as Person;

            switch (person.IsManager)
            {
                case true:
                    return element.FindResource("managerTemplate") as DataTemplate;

                case false:
                    return element.FindResource("juniorTemplate") as DataTemplate;

                default:
                    break;
            }
        }

        return null;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-07 23:58:50

ItemsControlItemsSource属性只能绑定到返回IEnumerable的集合。

您应该使用ContentControl才能绑定显示ComboBox的选定项

代码语言:javascript
复制
<ContentControl Grid.Row="1" ContentTemplateSelector="{StaticResource selector}" 
                Content="{Binding ElementName=cbo ,Path=SelectedItem}">
</ContentControl>
票数 2
EN

Stack Overflow用户

发布于 2017-03-07 23:57:23

我想我已经找到解决方案了。我需要使用ContentTemplateSelector

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42652506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档