c# - 如何为wpf设计器设置自定义控件的默认值?

时间:2011-08-16 14:25:05

标签: c# wpf

如何为自定义wpf组件设置默认值? 我有一个Textfield,其属性为“public Protection Protection {set; get;}”。保护是一个枚举:

public class Field3270Attributes{
    public enum Protection
    {
        PROTECTED,
        UNPROTECTED,
        AUTOSKIP
    }
}

默认值应该是autoskip但是protected会在wpf设计器中列为默认值,因为它是枚举中的第一个元素。 在Textfield构造函数中设置保护没有帮助。 我已经尝试了DependencyProperty,它确实有效但我必须指定一个回调(setProtection),如果我想要除默认值之外的任何值都可以工作。 如果我没有指定回调,则更改wpf设计器中的值无效。 有没有办法在不必为每个属性指定回调方法的情况下获得相同的行为?

public class Textfield{

    public static readonly DependencyProperty ProtectionProperty =
            DependencyProperty.Register("Protection",
                                        typeof(Field3270Attributes.Protection),
                                        typeof(Textfield3270),
                                        new FrameworkPropertyMetadata(Field3270Attributes.Protection.PROTECTED, setProtection));

    private static void setProtection(object sender, DependencyPropertyChangedEventArgs e)
    {
        Textfield field = (Textfield)sender;
        field.Protection = (Field3270Attributes.Protection)e.NewValue;
    }

    private Field3270Attributes.Protection protection;

    public Field3270Attributes.Protection Protection
    {
        get
        {
            return protection;
        }

        set
        {
            this.protection = value;

            if (value == Field3270Attributes.Protection.UNPROTECTED)
            {
                this.IsReadOnly = false;
                Background = Brushes.White;
            }
            else
            {
                this.IsReadOnly = true;
                Background = Brushes.LightSteelBlue;
            }
        }
    }

    public Textfield3270()
    {

        this.Protection = Field3270Attributes.Protection.PROTECTED;
    }

}

1 个答案:

答案 0 :(得分:1)

您的DependencyProperty定义定义了默认值。将FrameworkPropertyMetadata中的第一个参数从PROTECTED更改为AUTOSKIP

public static readonly DependencyProperty ProtectionProperty =
    DependencyProperty.Register("Protection",
        typeof(Field3270Attributes.Protection),
        typeof(Textfield3270),
        new FrameworkPropertyMetadata(Field3270Attributes.Protection.AUTOSKIP, setProtection));

修改

您通过使用相同名称实施自己的版本来覆盖Protection DependencyProperty。完全删除Protection {get; set;}的定义。

如果您希望它们显示在XAML设计器中,请将Get / Set定义为静态方法,如下所示:

public static Field3270Attributes.Protection GetProtection(DependencyObject obj)
{
    return (Field3270Attributes.Protection)obj.GetValue(ProtectionProperty);
}

public static void SetProtection(DependencyObject obj, Field3270Attributes.Protection value)
{
    obj.SetValue(ProtectionProperty, value);
}

如果要在PropertyChanged上附加一些逻辑,可以在类构造函数中使用此代码:

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Textfield.ProtectionProperty, typeof(Textfield));
if (dpd != null) dpd.AddValueChanged(this, delegate { Protection_Changed(); });

你改变的方法看起来像这样:

private void Protection_Changed()
{
    Field3270Attributes.Protection protection = GetProtection(this);

    // Do something with value
}