views:

76

answers:

1

I'm trying to create a login status control in silverlight where I will use multiple ControlTemplates to define conditional content.

So far I have created a LoginStatusControl

public class LoginStatusControl : ContentControl
{
    // these are actually Depedency Properties
    public ControlTemplate LoggedInTemplate { get; set; }
    public ControlTemplate AnonymousTemplate { get; set; } 

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var user = this.DataContext as User;
        if (user == null && this.AnonymousTemplate != null)
        {
            this.Template = this.AnonymousTemplate;
        }
        else if (this.LoggedInTemplate != null)
        {
            this.Template = this.LoggedInTemplate;
        }
    }
}

Then I've defined the templates in a Style.

<Style x:Key="UserStatusStyle" TargetType="local:LoginStatusControl">
    <Setter Property="LoggedInTemplate">
        <Setter.Value>
            <ControlTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="User " />
                    <TextBlock Text="{Binding FirstName}" />
                    <TextBlock Text=" " />
                    <TextBlock Text="{Binding LastName}" />
                    <TextBlock Text=" is logged in" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="AnonymousTemplate">
        <Setter.Value>
            <ControlTemplate>
                <TextBlock Text="Please create your profile" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

I'm having difficulty getting the conditional templates connected to override the ControlTemplate.

While searching I found this question and tried to use template binding but I couldn't get that to work.

Is there anyway to get this conditional templates to display if the user is logged in or not? Is there another way of solving this problem that I'm missing? I'm hoping to come up with a solution that can update the template dynamically when the DataContext of the control changes.

A: 

Well, I ended up going with a ContentContent's Content property and providing conditional DataTemplates.

Here is the Control:

public class LoginStatusControl : ContentControl
{
    public DataTemplate LoggedInTemplate
    {
        get { return (DataTemplate)GetValue(LoggedInTemplateProperty); }
        set { SetValue(LoggedInTemplateProperty, value); }
    }

    // Using a DependencyProperty as the backing store for LoggedInTemplate.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty LoggedInTemplateProperty =
        DependencyProperty.Register("LoggedInTemplate", typeof(DataTemplate), typeof(LoginStatusControl), new PropertyMetadata(null));


    public DataTemplate AnonymousTemplate
    {
        get { return (DataTemplate)GetValue(AnonymousTemplateProperty); }
        set { SetValue(AnonymousTemplateProperty, value); }
    }

    // Using a DependencyProperty as the backing store for AnonymousTemplate.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty AnonymousTemplateProperty =
        DependencyProperty.Register("AnonymousTemplate", typeof(DataTemplate), typeof(LoginStatusControl), new PropertyMetadata(null));


    public LoginStatusControl()
    {
        DefaultStyleKey = typeof(LoginStatusControl);
    }

    public override void OnApplyTemplate()
    {
        UpdateTemplate();

        base.OnApplyTemplate();
    }

    private void UpdateTemplate()
    {
        var content = (ContentControl)base.GetTemplateChild("LoginControl");
        if (content == null)
            return;

        var user= this.DataContext as User;
        if (user == null && this.AnonymousTemplate != null)
        {
            content.Content = this.DataContext;
            content.ContentTemplate = this.AnonymousTemplate;
        }
        else if (this.LoggedInTemplate != null)
        {
            content.Content = this.DataContext;
            content.ContentTemplate = this.LoggedInTemplate;
        }
    }
}

And here is the Default Style.

 <Style x:Key="LoginStatusStyle" TargetType="controls:LoginStatusControl">
    <Setter Property="LoggedInTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="User: "/>
                    <TextBlock Text="{Binding FirstName}" FontWeight="Bold" />
                    <TextBlock Text=" " />
                    <TextBlock Text="{Binding LastName}" FontWeight="Bold"  />
                    <TextBlock Text=" is logged in" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="AnonymousTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="Please create your profile" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <ContentControl x:Name="LoginControl" Margin="10,0" VerticalAlignment="Center" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
bendewey