在Silverlight中创建LoginStatusControl

时间:2009-09-01 00:58:54

标签: controltemplate

我正在尝试在silverlight中创建一个登录状态控件,我将使用多个ControlTemplates来定义条件内容。

到目前为止,我已经创建了一个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;
        }
    }
}

然后我在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>

我很难连接条件模板以覆盖ControlTemplate。

搜索时我发现this question并试图使用模板绑定,但我无法使用它。

如果用户已登录,是否仍然可以显示此条件模板?还有另一种解决这个问题的方法吗?我希望能够提出一个解决方案,当控件的DataContext发生变化时,可以动态更新模板。

1 个答案:

答案 0 :(得分:0)

好吧,我最终使用ContentContent's Content属性并提供条件DataTemplates。

这是控制:

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

这是默认样式。

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