如何在WPF中将内部控件的属性公开给其父UserControl

时间:2015-05-14 14:44:12

标签: wpf xaml properties user-controls

我有一个DialogPrompt UserControl,它将包含一个Image和一个TextBlock。这是模板:

class func executeRequest<T: WebServiceProtocol>(delegate: T,url:String,postParameters:[String:String],headerParameters:[String:String]) {

}

如何在UserControl中公开TextBlock的Image和Text属性的Source属性?

2 个答案:

答案 0 :(得分:9)

我会创建两个DependencyProperties,一个用于Text,另一个用于Image Source

Image Source DependencyProperty会在更新时自动设置内部Image控件的来源。同样,Text DependencyProperty也会设置内部Text控件的TextBlock

以下是设置:

public partial class MyUserControl : UserControl
{
    #region ImageSource
    public static readonly DependencyProperty ImageSourceProperty = 
        DependencyProperty.Register
        ( 
            "ImageSource", 
            typeof(Uri),
            typeof(MyUserControl), 
            new FrameworkPropertyMetadata(new PropertyChangedCallback(OnImageSourceChanged))
        );

    public Uri ImageSource
    {
        get { return (Uri)GetValue(ImageSourceProperty); }
        set { SetValue(ImageSourceProperty, value); }
    }
    #endregion ImageSource

    #region Text
    public static readonly DependencyProperty TextProperty = 
        DependencyProperty.Register
        ( 
            "Text", 
            typeof(string),
            typeof(MyUserControl), 
            new FrameworkPropertyMetadata("")
        );

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
    #endregion Text

    public MyUserControl()
    {
        InitializeComponent();
    }

    private static void OnImageSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var myUserControl = sender as MyUserControl;
        if (myUserControl != null)
        {
            myUserControl.ImageSource.Source = new BitmapImage((Uri) e.NewValue);
        }
    }
} 

每当Image Source发生更改时,都会自动更新内部Image控件的来源。请注意,我们需要在此进行一些转换,因为Image控件本身使用ImageSource类型。

然后可以将XAML更新为:

   <UserControl x:Name="ControlName">   
      <Button x:Name = "OkButton" Content="OK"/>
      <DockPanel >
        <Image x:Name = "MyImage" />
        <TextBlock x:Name = "DialogTextBox" Text="{Binding ElementName=ControlName, Path=Text}"/>
      </DockPanel>
    </UserControl>

此处,内部TextBlock控件只会绑定到父级Text DependencyProperty(主UserControl)。

答案 1 :(得分:4)

在你的代码中,添加2个DependencyProperties并将它们绑定到Image Source和TextBlock Text。

以下是有关如何使用和创建依赖项属性的教程: http://www.wpftutorial.net/dependencyproperties.html

对于你在xaml中的绑定,这是一个例子:

<Image Source="{Binding YourProperty, RelativeSource={RelativeSource FindAncestor, AncestorType=YourUserControl}}/>