C# 如何定义具有两个子依赖属性的extend stackpanel控件

C# 如何定义具有两个子依赖属性的extend stackpanel控件,c#,silverlight,C#,Silverlight,我必须编写一个ExtendedStackPanel控件,它将有两个类似这样的依赖属性 <ExtendedStackPanel IsReadOnly="{Binding Item.IsReadOnly, Mode=OneWay}" > <TemplateTrue> ... control visible when isreadonly is true </TemplateTrue>

我必须编写一个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>
在我的代码中,当IsReadOnly设置为false时,我放置了一个combobox控件,当IsReadOnly设置为true时,放置了一个简单的文本框,但在代码运行时不显示任何内容。
请帮帮我。

最后,我选择使用一个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));
        }
    }
}

希望这会对其他人有所帮助。

所有这些都只是选择一个或另一个子控件,具体取决于绑定的
项的值。IsReadOnly
属性?这是否用于ItemsControl的ItemTemplate中?是。我使用了一种行为来直接控制combobox中的只读状态,但当combobox为只读时,可以通过鼠标旋转或键盘箭头来更改值。这就是为什么我开发了上面的解决方案。但是为什么不让一个数据模板,上面有一个组合框和一个文本块,然后根据项目的只读状态切换它们各自的可见性呢?为什么要从StackPanel派生?我不认为有必要。@Clemens:我想在我的xaml中的另一个控件中重用它。组合框和日期选择器有相同的问题。
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));
        }
    }
}