如何使用两个子依赖项属性定义扩展stackpanel控件

时间:2014-07-02 08:43:01

标签: c# silverlight

我必须编写一个ExtendedStackPanel控件,它将具有两个依赖属性,如下所示。

<ExtendedStackPanel  IsReadOnly="{Binding Item.IsReadOnly, Mode=OneWay}"  >
     <TemplateTrue>
                         ... control visible when isreadonly is true  
      </TemplateTrue>
      <TemplateFalse>
                           ... control visible when isreadonly is false
       </TemplateFalse>
</ExtendedStackPanel>

我写这篇文章是为了达到目标,但它没有用。

public class ExtendedStackPanel : StackPanel
{
    public ExtendedStackPanel()
        : base()
    {
        this.Orientation = System.Windows.Controls.Orientation.Vertical;
    }
    #region IsReadOnly
    public bool IsReadOnly
    {
        get { return (bool)GetValue(IsReadOnlyProperty); }
        set { SetValue(IsReadOnlyProperty, value); }
    }
    public static readonly DependencyProperty IsReadOnlyProperty =
        DependencyProperty.Register("IsReadOnly", typeof(bool),
            typeof(ExtendedStackPanel), new PropertyMetadata(new PropertyChangedCallback(OnReadOnlyChanged)));

    static void OnReadOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var visible = (bool)e.NewValue;
        var control = d as ExtendedStackPanel;
        if (visible)
        {
            control.TemplateTrue.Visibility = Visibility.Visible;
            control.TemplateFalse.Visibility = Visibility.Collapsed;
        }
        else
        {
            control.TemplateTrue.Visibility = Visibility.Collapsed;
            control.TemplateFalse.Visibility = Visibility.Visible;
        }

    }
    #endregion
    #region TemplateTrue
    public Control TemplateTrue
    {
        get { return (Control)GetValue(TemplateTrueProperty); }
        set { SetValue(TemplateTrueProperty, value); }
    }
    public static readonly DependencyProperty TemplateTrueProperty =
            DependencyProperty.Register("TemplateTrue", typeof(Control),
            typeof(ExtendedStackPanel), new PropertyMetadata(new PropertyChangedCallback(OnTemplateTrueChanged)));

    static void OnTemplateTrueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as ExtendedStackPanel;
        control.TemplateTrue.Visibility = control.IsReadOnly ? Visibility.Visible : Visibility.Collapsed;
    }
    #endregion
    #region TemplateFalse
    public Control TemplateFalse
    {
        get { return (Control)GetValue(TemplateFalseProperty); }
        set { SetValue(TemplateFalseProperty, value); }
    }
    public static readonly DependencyProperty TemplateFalseProperty =
            DependencyProperty.Register("TemplateFalse", typeof(Control),
            typeof(ExtendedStackPanel), new PropertyMetadata(new PropertyChangedCallback(OnTemplateFalseChanged)));

    static void OnTemplateFalseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as ExtendedStackPanel;
        control.TemplateFalse.Visibility = !control.IsReadOnly ? Visibility.Visible : Visibility.Collapsed;
    }
    #endregion
}

在我的代码中,我在IsReadOnly设置为false时放置了一个组合框控件,在IsReadOnly设置为true时放置了一个简单的文本框,但是在运行代码时没有显示任何内容。 请帮帮我。

1 个答案:

答案 0 :(得分:0)

最后,我选择使用UserControl,其中我放了两个ContentControl。 在UserControl后面的代码中,我写了这个:

public partial class ConditionalControl : UserControl, INotifyPropertyChanged
{
    public ConditionalControl()
    {
        InitializeComponent();
        this.IsReadOnly = false;
    }
    #region IsReadOnly
    public bool IsReadOnly
    {
        get { return (bool)GetValue(IsReadOnlyProperty); }
        set { SetValue(IsReadOnlyProperty, value); }
    }
    public static readonly DependencyProperty IsReadOnlyProperty =
        DependencyProperty.Register("IsReadOnly", typeof(bool),
            typeof(ConditionalControl), new PropertyMetadata(new PropertyChangedCallback(OnReadOnlyChanged)));

    static void OnReadOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var visible = (bool)e.NewValue;
        var control = d as ConditionalControl;            
        if (visible)
        {
            control.TemplateTrueContent.Visibility = Visibility.Visible;
            control.TemplateFalseContent.Visibility = Visibility.Collapsed;
        }
        else
        {
            control.TemplateTrueContent.Visibility = Visibility.Collapsed;
            control.TemplateFalseContent.Visibility = Visibility.Visible;
        }

    }
    #endregion
    #region TemplateFalse
    public object TemplateFalse
    {
        get { return (object)GetValue(TemplateFalseProperty); }
        set { SetValue(TemplateFalseProperty, value); }
    }
    public static readonly DependencyProperty TemplateFalseProperty =
            DependencyProperty.Register("TemplateFalse", typeof(object),
            typeof(ConditionalControl), new PropertyMetadata(new PropertyChangedCallback(OnTemplateFalseChanged)));

    static void OnTemplateFalseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as ConditionalControl;
        control.TemplateFalseContent.Visibility = !control.IsReadOnly ? Visibility.Visible : Visibility.Collapsed;
        control.OnPropertyChanged("TemplateFalse");
    }
    #endregion
    #region TemplateTrue
    public object TemplateTrue
    {
        get { return (object)GetValue(TemplateTrueProperty); }
        set { SetValue(TemplateTrueProperty, value); }
    }
    public static readonly DependencyProperty TemplateTrueProperty =
            DependencyProperty.Register("TemplateTrue", typeof(object),
            typeof(ConditionalControl), new PropertyMetadata(new PropertyChangedCallback(OnTemplateTrueChanged)));

    static void OnTemplateTrueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as ConditionalControl;
        control.TemplateTrueContent.Visibility = control.IsReadOnly ? Visibility.Visible : Visibility.Collapsed;
        control.OnPropertyChanged("TemplateTrue");
    }
    #endregion

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (propertyName == "TemplateFalse")
        {
            this.TemplateFalseContent.Content = this.TemplateFalse;
        }
        if (propertyName == "TemplateTrue")
        {
            this.TemplateTrueContent.Content = this.TemplateTrue;
        }
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

希望这会对某人有所帮助。