我想创建一个自定义面板,其中项目呈现为按钮,内部有关闭按钮(x)。我到目前为止所做的是创建一个自定义控件,该控件派生自ItemsControl,并设置itemspanel和itemtemplate的模板,如下所示:
XAML:
<ItemsControl x:Class="SandBox1.CustomControls.WorkspacePanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True" Orientation="Horizontal" HorizontalAlignment="Left"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Name}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
代码隐藏:
public partial class WorkspacePanel : ItemsControl
{
public WorkspacePanel()
{
InitializeComponent();
}
}
然而,当我设置ItemsSource时,我什么都没得到。有什么帮助吗?
使用自定义控件:
<cc:WorkspacePanel ItemsSource="{Binding Path=Workspaces}"/>
工作区的类型为ObservableCollection<WorkspaceModel>
,WorkspaceModel为:
public class WorkspaceModel
{
public WorkspaceModel(string name, bool isActive)
{
this.Name = name;
this.IsActive = isActive;
}
public bool IsActive { get; set; }
public string Name { get; set; }
}
答案 0 :(得分:0)
RelativeSource.TemplatedParent
适用于ControlTemplates
,在这里您应该通过不指定任何来源绑定到DataContext:
{Binding Path=Name}
或只是
{Binding Name}
编辑:作为自定义控件的控件我会放弃这种方法(我不知道它是否可以工作),除非你手动编写很多代码VS通常会写对你而言。
当您创建控件并且您的项目没有通用主题时,它应该已创建Themes
文件夹和Generic.xaml
,在该类中您可以设置样式中的属性(请注意BasedOn
获取默认ItemsControl中的模板和其他属性:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SandBox1.CustomControls">
<Style TargetType="{x:Type local:WorkspacePanel}" BasedOn="{StaticResource {x:Type ItemsControl}}">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True" Orientation="Horizontal" HorizontalAlignment="Left" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Button Content="{Binding Name}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>