Silverlight自定义用户控件和依赖项属性问题

时间:2009-03-09 15:44:42

标签: silverlight user-controls

我有一个名为Field的自定义用户控件:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0" Name="LblName"/>
    <TextBox Grid.Row="0" Grid.Column="1" HorizontalContentAlignment="Left" Name="TxtValue"/>
</Grid>

在CS文件中,我公开了下面的属性,它只是设置了文本框的“.text”值。

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
        "Value",
        typeof(string),
        typeof(Field),
        new PropertyMetadata(
            default(string),
            (source, args) => (source as Field).TxtValue.Text = (string)args.NewValue
        )
    );

    [Category("Custom")]
    public string Value
    {
        get
        {
            return (string)this.GetValue(ValueProperty);
        }
        set
        {
            this.SetValue(ValueProperty, value);
        }
    }

第一个问题。这是我们传播子用户控件依赖属性的正确方法,通过父用户控件进行备份,以便可以从页面xaml进行设置吗?我在网上看了一下,考虑到在编写自定义控件时这是一个相当原始的东西,没有多少。

详细介绍大局,我有客户详细信息页面,有些控件绑定到可观察集合中包含的客户对象。如果我将页面上的文本框(包含在Field控件中)的值从“xxxx”更改为“yyyy”,我总是返回“xxxx”。看起来好像在吸气剂周围出现了问题?

1 个答案:

答案 0 :(得分:1)

这绝对是允许属性传播的正确方向的一步。

如果这是一个真正的自定义控件(从Control派生),你想要使用{TemplateBinding Value}加上你应该也可以连接到TextBox上的TextChanged事件,在设置模板部分之后OnApplyTemplate方法。这样,你也可以让它更新你的底层TxtValue依赖属性。

如果这是UserControl,您可以使用Binding,但是您可以选择少量选项。如你所知,你的属性改变了回调函数只朝一个方向:你只设置Text值,你永远不会对它做出反应。

让我们希望那里的文件有所改进。