Thomas D'Hulst
Thomas D'Hulst

Reputation: 41

WinRT DependencyProperty is never set

I have some issues with my DependencyProperty in a custom UserControl.

I need to display informations about people in a particular way. To achieve this, I have several UserControls that receive a List<PeopleList> which contains (obviously) one or more People.

Let me show you my (simplified) code and I'll then explain to you the actual behavior of my app.

Here is my UserControl :

public abstract class PeopleLine : UserControl
{
    public static readonly DependencyProperty PeopleListProperty =
        DependencyProperty.Register("PeopleList", typeof(List<PeopleModel>), typeof(PeopleLine), new PropertyMetadata(default(List<PeopleModel>)));

    public List<PeopleModel> PeopleList
    {
        get { return (List<PeopleModel>)GetValue(PeopleListProperty); }
        set { SetValue(PeopleListProperty, value); }
    }
}

Then my xaml :

<local:PeopleLine
    x:Class="MyApp.Controls.EventSheet.OnePeople"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MyApp.Controls.EventSheet"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid
        Margin="0 5"
        VerticalAlignment="Top"
        Height="51">
        <TextBlock
            Grid.Column="1"
            HorizontalAlignment="Center"
            Foreground="Red"
            FontSize="25"
            Text="{Binding PeopleList[0].Name}"/>
    </Grid>
</local:PeopleLine>

And this all starts with my Page which contains an ItemsControl with a correct ItemsSource (I already checked it) and an ItemTemplateSelector (also working perfectly). Here is one of the DataTemplate used by the selector :

<DataTemplate x:Key="OnePeople">
    <peoplecontrols:OnePeople
        PeopleList="{Binding LinePeopleList}"/>
</DataTemplate>

I'm using several Models That are not really important here since I simplified my code to only have the most important information.

So, back to my issue. When replacing the peoplecontrols:OnePeople in the selector's DataTemplate by a string and putting LinePeopleList[0].Nameas Text, I have the correct text displayed, proving me that my data is correct at this point. Problem is that when putting back my peoplecontrols:OnePeople, my DependencyProperty is never set. I put a breakpoint at PeopleList's setter and it never triggers.

I tried several modifications (especially those that are given in this post, so replacing the typeof(List<PeopleModel>)by typeof(object) has already been tried) with no success. Also, I tried to replace my DependencyProperty to a string and directly send the name in the DataTemplate but the setter is still not called...

I have no more ideas now and don't understand what's wrong with my code. Any help would be greatly appreciated. Thanks in advance.

Thomas

Upvotes: 2

Views: 61

Answers (1)

Mikael Koskinen
Mikael Koskinen

Reputation: 12926

Try adding the following line in your UserControl's Constructor, after the call to InitializeComponent:

(this.Content as FrameworkElement).DataContext = this;

I created a sample app on regarding this. Hopefully it reflects your situation correctly:

https://github.com/mikoskinen/uwpusercontrollistdp

If you clone the app and run it, you'll notice that the binding doesn't work. But if you uncomment the Datacontext = this line from UserControl, everything should work OK. Here's working code:

    public PeopleLine()
    {
        this.InitializeComponent();

        (this.Content as FrameworkElement).DataContext = this;
    }

Upvotes: 1

Related Questions