如何将UserControl中的嵌套控件完全暴露给外部?

时间:2016-02-12 07:29:31

标签: wpf xaml user-controls dependency-properties

我们说我有一个非常简单的UserControl:

<UserControl x:Class="Test.UserControls.MyControl">
    <DockPanel>
        <Label Content="lorem" />
        <Button Name="ButtonFromUserControl" />
    </DockPanel>
</UserControl>

例如,如果我在另一个文件中添加UserControl,我想从外部访问Button的所有属性。我想象这样的事情:

 <StackPanel>
     <usercontrols:MyControl Button.Dock="{Binding ButtonDockPosition}"/>
 </StackPanel>

我知道我可以为每个属性创建依赖属性以使它们可访问,但是我还不知道以后可能会或可能不会使用哪些属性并且不想为每个属性添加DP嵌套控件&#39;属性。

我不确定这是否是正确的方法,如果还有其他方式或模式我也感兴趣。

修改

我还尝试将Button本身设为DP,但这并不能让我访问其属性:

 public static readonly DependencyProperty NestedButtonProperty =
            DependencyProperty.RegisterAttached("NestedButton", typeof (Button), typeof (MyControl),
                new FrameworkPropertyMetadata());


 public Button NestedButton => ButtonFromUserControl;

1 个答案:

答案 0 :(得分:1)

我找到了一种解决方法,至少不要求我生成大量的转发DP。由于大多数(或所有?)控件的属性也可以通过Style设置,我只需将每个控件的Style设为DP:

public static readonly DependencyProperty ButtonStyleProperty =
            DependencyProperty.RegisterAttached("ButtonStyle", typeof (Style), typeof (MyUserControl),
                new FrameworkPropertyMetadata());

 public Style ButtonStyle
 {
   get { return (Style) GetValue(ButtonStyleProperty); }
   set { SetValue(ButtonStyleProperty, value); }
 }

将其绑定在UserControl中:

 <Button Name="InnerButton" Style="{Binding ButtonStyle, ElementName=MyUserControl}" />

现在,您可以使用自定义样式设置Button的属性:

 <userControls:MyUserControl>
            <userControls:MyUserControl.ButtonStyle>
                <Style TargetType="Button">
                    <Style.Setters>
                        <Setter Property="Content" Value="ButtonContent" />
                        <Setter Property="BorderThickness" Value="5" />
                        <Setter Property="BorderBrush" Value="Orange" />
                    </Style.Setters>
                </Style>
            </userControls:MyUserControl.ButtonStyle>
  </userControls:MyUserControl>