2013-03-30 3 views
0

У меня есть UserControl MyParentControl, у которого есть другой элемент управления внутри (TreeView). Я выставляю этот элемент управления как свойство dep, скажем TreeView MyChildControl.Как создать дочерний элемент UserControl в XAML в Silverlight?

Затем в XAML, который использует MyParentConrol, я хочу получить доступ ко всем свойствам TreeView, например Style.

Я хочу написать что-то вроде:

<my:MyParentControl> 
    <my:MyParentControl.MyChildControl.Style> 
     <Style /> 
    </my:MyParentControl.MyChildControl.Style> 
</my:MyParentControl> 

Есть ли способ достичь этого?

ответ

1

Вы бы получить этот эффект, написав XAML как это:

<my:MyParentControl> 
    <my:MyParentControl.Resources> 
     <Style TargetType="my:MyChildControl"> 
     <Setter Property="Background" Value="Red"/> 
     </Style> 
    </my:MyParentControl.Resources> 
<my:MyParentControl> 

В данном примере это XAML создает MyParentControl, в котором все дети типа MyChildControl имеют красный фон.

2

Выставляя DependencyProperty для вашего внутреннего контроля, вы решили половину проблемы - то есть вы можете установить индивидуальные свойства в xaml.

Следующий шаг заключается в том, чтобы эти средства определения свойств влияли на дочерний элемент управления.

Существует два варианта достижения этого.

  1. В шаблоне управления определите свой дочерний элемент управления и используйте привязки для каждого свойства, которое вы хотите установить.

  2. Определите элемент контейнера в родительском шаблоне управления и установите его контент вашему ребенку всякий раз, когда изменяется свойство зависимостей.

Хотя оба этих методов могли бы работать, вы можете обнаружить, что решение, содержащее наименьшее количество кода, и наибольшую гибкость, чтобы выставить свойство Style для дочернего элемента управления и применить, что в контрольный шаблон.

public class ParentControl : Control 
{ 
    public Style ChildControlStyle 
    { 
     get { return (Style)GetValue(ChildControlStyleProperty); } 
     set { SetValue(ChildControlStyleProperty, value); } 
    } 

    public static readonly DependencyProperty ChildControlStyleProperty = 
     DependencyProperty.Register("ChildControlStyle", 
            typeof(Style), 
            typeof(ParentControl), 
            new PropertyMetadata(null)); 
} 

<Style TargetType="ParentControl"> 
    <Setter Property="ChildControlStyle"> 
     <Setter.Value> 
      <Style TargetType="ChildControl"> 
       <!-- setters --> 
      </Style> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ParentControl"> 
       <Grid> 
        <ChildControl Style="{TemplateBinding ChildControlStyle}" /> 
        <!-- other stuff --> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Я считаю, что это очень хороший ответ. и спасибо за это. к сожалению, может быть только один знак, и этот парень придумал решение, которое немного привлекательнее * в моем случае *. но я все еще ваш хороший! –

Смежные вопросы