wpf custom control problem

Posted by josika on Stack Overflow See other posts from Stack Overflow or by josika
Published on 2010-05-26T16:53:44Z Indexed on 2010/05/27 8:01 UTC
Read the original article Hit count: 206

Filed under:
|
|
|

Hi!

I have a problem, and I have not found the solution yet. I woud like to create a base custom control and use it in another custom control. The base control work fine when I use in a window, but when I use in the other custom control, the binding does not work.

What's wrong with my code?

Code:

Model:

public class ElementModel
{
    public string Name { get; set; }
    public string FullName { get; set; }
}

The base control:

public class ListControl : Control
{        
    static ListControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ListControl), new FrameworkPropertyMetadata(typeof(ListControl)));
    }

    public ListControl()
    {
        SetValue(ElementListProperty, new List<ElementModel>());
    }

    public static readonly DependencyProperty ElementListProperty =
        DependencyProperty.Register(
        "ElementList", 
        typeof(List<ElementModel>), 
        typeof(ListControl),
        new FrameworkPropertyMetadata(new List<ElementModel>())
      );

    public List<ElementModel> ElementList
    {
        get { return (List<ElementModel>)GetValue(ElementListProperty); }
        set { SetValue(ElementListProperty, value); }
    }
}

The Wrapper Control:

public class ListWrapper : Control
{
    static ListWrapper()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ListWrapper), new FrameworkPropertyMetadata(typeof(ListWrapper)));
    }

    public ListWrapper()
    {
        SetValue(EMListProperty, new List<ElementModel>());
    }

    public static readonly DependencyProperty EMListProperty =
       DependencyProperty.Register(
       "EMList",
       typeof(List<ElementModel>),
       typeof(ListWrapper),
       new FrameworkPropertyMetadata(new List<ElementModel>())
     );

    public List<ElementModel> EMList
    {
        get { return (List<ElementModel>)GetValue(EMListProperty); }
        set { SetValue(EMListProperty, value); }
    }
}

Generic.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:UIControl">

<Style TargetType="{x:Type local:ListControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ListControl}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">

                    <ListBox ItemsSource="{TemplateBinding ElementList}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <Label Content="Name:"/>
                                    <TextBlock Text="{Binding Path=Name}" />
                                    <Label Content="Full name:"/>
                                    <TextBlock Text="{Binding Path=FullName}" />
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type local:ListWrapper}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ListWrapper}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">

                    <local:ListControl ElementList="{TemplateBinding EMList}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

If I put the controls in the window and binding properties, than the ListControl works fine and shows the elements, but the WrapperList does not.

<Window x:Class="MainApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="clr-namespace:UIControl;assembly=UIControl"
Title="Window1" Height="304" Width="628">
<Grid>
    <ui:ListControl x:Name="listCtr" ElementList="{Binding Path=EList}" HorizontalAlignment="Left" Width="300" />
    <ui:ListWrapper x:Name="listWrp" EMList="{Binding Path=EList}" HorizontalAlignment="Right" Width="300"  Background="Gray"/>
</Grid>

Project archive

© Stack Overflow or respective owner

Related posts about c#

Related posts about wpf