WPF:如何将 ItemsControl 中的项目包装在另一个模板中?

标签 wpf data-binding xaml datatemplate

我有一个ItemsControl,其中包含每个项目都有自己的DataTemplate。 ItemsSource 中的每个 ViewModel 类都派生自具有 Header 属性的共同祖先。

我想将每个项目包装在 Expander 控件中,但我的问题是我不知道如何将每个“DataTemplate”“结转”到扩展部分的 DataContext扩展器。

在代码中,我的问题如下所示:

VieModel:

public class VM { public string Name { get; set; } }
public class VM1 : VM { public string Description { get; set; } }
public class VM2 : VM { public string Sakkie { get; set; } }

代码隐藏的 Items 属性(因为对于这个问题来说它很简单)

    public IEnumerable<VM> Items
    {
        get
        {
            yield return new VM1() { Name = "First VM1", Description = "First VM1 Description" };
            yield return new VM2() { Name = "Vm2, nr2", Sakkie = "sakkie sakkie boeredans" } ;
            yield break;
        }
    }

窗口的XAML:

<Window.Resources>
    <DataTemplate DataType="{x:Type local:VM1}">
        <local:VM1UC />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:VM2}">
        <local:VM2UC />
    </DataTemplate>
    <DataTemplate x:Key="DataTemplate1">
        <Expander Header="{Binding Name}">
            <ContentPresenter DataContext="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"/>
        </Expander>
    </DataTemplate>
</Window.Resources>
<ItemsControl ItemsSource="{Binding Items}" Background="LightCoral" ItemTemplate="{DynamicResource DataTemplate1}"/>

看起来像这样,令人惊讶,但可以理解:

alt text http://img514.imageshack.us/img514/6937/itemscontrol.png

我实际上希望自定义用户控件出现在扩展部分中......

最佳答案

您应该设置Content,而不是设置DataContext:

<ContentPresenter Content="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"/>

这将确保根据 Content 的类型解析适当的 DataTemplate

关于WPF:如何将 ItemsControl 中的项目包装在另一个模板中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1547450/

相关文章:

c# - 在分组列表框 View 中拉伸(stretch)标题宽度

c# - 扩展 WPF 应用程序

asp.net - 在 ListView InsertItemTemplate 中绑定(bind) DropDownList 会引发错误

wpf - 将数据模板绑定(bind)到 ContentControl 的内容

wpf - WPF 中的主细节绑定(bind)

wpf - 在 wpf 中显示 xaml 图像

C#/XAML Tapped 事件

c# - 当您绑定(bind)到 ItemSsource 时内部会发生什么?

wpf - 文本框员工名称与员工名称文本框

c# - 我无法在 XAML 文件中写入阿拉伯文本