1

我有一个这样实现的控件:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="10*"/>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>
        <TextBox Grid.Column="0"/>
        <Button Grid.Column="1" Content="Browse..." Margin="5,0,5,0"/>
        <Button Grid.Column="2" Content="Load File" Margin="5,0,5,0"/>
    </Grid>

这被设计为用作独立控件。例如,我如何允许此控件的使用者绑定到Text文本框的属性。我是否需要实现自己的依赖属性并自己处理实际的文本框数据,或者有没有办法让消费者直接绑定到内部属性?

4

2 回答 2

2

如果这是一个供其他人在 XAML 中使用的控件,那么是的,您应该将您的属性公开为 DependencyProperties。这允许使用您的控件的任何人在您的控件上使用绑定等。

public partial class MyControl: UserControl
{
    public static readonly DependencyProperty FileNameProperty = 
           DependencyProperty.Register("FileName ", typeof(string), typeof(MyControl));

    public string FileName
    {
        get 
        {
            return (string )GetValue(FileNameProperty ); 
        }
        set 
        {
            SetValue(FileNameProperty , value); 
        }
    }
}

然后,您可以将控件标记中的自己的文本框绑定到相同的属性:

<UserControl x:Class="MyControl">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="10*"/>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>
        <TextBox Grid.Column="0" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type MyControl}}, Path=FileName}" />
        <Button Grid.Column="1" Content="Browse..." Margin="5,0,5,0"/>
        <Button Grid.Column="2" Content="Load File" Margin="5,0,5,0"/>
    </Grid>
</UserControl>
于 2012-07-17T12:19:16.230 回答
0

嗨,让您控制的公共财产为

public string PropertyName
       {
           get{return _propertyName;}
           set{
               _propertyName=value;
                BindingOperations.SetBinding(textboxName,TextBox.TextProperty,new Binding(){Mode=BindingMode.TwoWay,Source=PropertyName})
              }
       }

并让消费者简单地指定 PropertyName="PropertyToBind" 。我希望这会有所帮助。textboxName 是您的控件 TextBox 的名称。

于 2012-07-17T12:06:38.570 回答