2016-02-12 76 views
3

比方說,我有一個非常簡單的用戶控件:如何將UserControl中的嵌套控件完全暴露給外部?

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

例如,我想從外部訪問按鈕的所有屬性,如果我在另一個文件中添加用戶控件。我想象這樣的事情:

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

我知道我可以創建依賴屬性爲每個屬性,使他們可以訪問,但是我還不知道這可能會或可能不會在以後使用和不想要爲每個嵌套控件的屬性添加一個DP。

我不確定這是否是正確的方式來做到這一點,如果有另一種方式或模式我也會感興趣。

編輯:

我也試圖使按鈕本身就是一個DP,但doesnt't讓我訪問它的屬性:它在

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


public Button NestedButton => ButtonFromUserControl; 
+0

您想僅通過XAML或代碼隱藏訪問控件嗎? – StepUp

+0

XAML將是理想的。 – Lennart

+0

是否嘗試給Button和UserControl一個名稱,然後嘗試通過XAML訪問它? – safi

回答

1

我已經找到了解決辦法樣的至少不需要我生成大量的轉發DP。由於大多數(?或全部)控件的屬性都可以通過一個樣式也設置,我只是使各文體控制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); } 
} 

綁定它在該用戶控件:

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

現在您可以使用自定義樣式設置按鈕的屬性:

<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>