Пользовательская панель WPF из ItemsControl - PullRequest
0 голосов
/ 08 июня 2011

Я хочу создать пользовательскую панель, в которой элементы отображаются в виде кнопок с кнопкой закрытия (x) внутри.До сих пор я создавал пользовательский элемент управления, который наследуется от ItemsControl, и настраивал шаблоны для элементов и панели элементов следующим образом:

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>

Codebehind:

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

1 Ответ

0 голосов
/ 08 июня 2011

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