WPF:在设计时从另一个属性值设置属性值

时间:2015-09-14 13:17:19

标签: c# wpf

我已经从Label创建了一个自定义控件。我添加了一个新的依赖属性“MyCaption”。我将Content proeprty视为隐藏:

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public new string Content { get; set; }

现在,我想要这种行为:如果我设置MyCaption值,我希望在设计时也使用该值设置内容。

一些想法?

编辑:我试图像这样定义我的依赖属性,但它不起作用:

public static readonly DependencyProperty MyCaptionProperty =
    DependencyProperty.Register("MyCaption ",
                                typeof(string),
                                typeof(TMSLabel));

    [Description("Valore della label"), Category("MyProperties")] 
    public string MyCaption 
    {
        get { return (string)GetValue(MyCaptionProperty); }
        set { 
            SetValue(MyCaptionProperty, value);
            Content = value;
        }
    }

提示:如果我删除使得内容属性为隐藏的代码,则上面的代码可以工作!

1 个答案:

答案 0 :(得分:0)

从 - http://wpftutorial.net/DependencyProperties.html

重要说明:不要向这些属性添加任何逻辑,因为只有在从代码设置属性时才会调用它们。如果从XAML设置属性,则直接调用SetValue()方法。

因此,尝试从“依赖项属性”设置设置“内容”属性听起来不对。

如何尝试使用PropertyChangedCallBack

public class MyLabel : Label
{
    public static readonly DependencyProperty MyCaptionProperty =
        DependencyProperty.Register("MyCaption ",
                                    typeof(string),
                                    typeof(MyLabel), new FrameworkPropertyMetadata(string.Empty, OnChangedCallback));

    public string MyCaption
    {
        get { return (string)GetValue(MyCaptionProperty); }
        set { SetValue(MyCaptionProperty, value); }
    }

    private static void OnChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var labelControl = d as Label;
        if (labelControl != null)
            labelControl.Content = e.NewValue;
    }
}

<Window x:Class="WpfTestProj.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfTestProj="clr-namespace:WpfTestProj"        
    Title="MainWindow" Height="350" Width="525">
<wpfTestProj:MyLabel MyCaption="This is a test" />