Шаблон ContentControl через свойство - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть Usercontrol с ControlTemplate DependencyProperty (с именем MyItemTemplate).

public ControlTemplate MyContentControl
        {
            get { return (ControlTemplate)GetValue(MyContentControlProperty); }
            set { SetValue(MyContentControlProperty, value); }
        }
        public static readonly DependencyProperty MyContentControlProperty =
            DependencyProperty.Register("MyContentControl", typeof(ControlTemplate), typeof(MyScroll),
              new PropertyMetadata(new ControlTemplate()));

В xaml моего UserControl я хочу использовать «MyItemTemplate» в качестве шаблона для ContentControl, например:

<ContentControl x:Name="MyContentControl" Template="{Binding MyItemTemplate}" />

Я знаю, что Template = "{Binding MyItemTemplate}" * неверно, но мне интересно, как это сделать ...

Спасибо

Ответы [ 3 ]

4 голосов
/ 01 декабря 2011

Вы можете использовать привязку RelativeSource для ссылки на пользовательский DependencyProperty в вашем UserControl

<ContentControl Template="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}, 
    Path=MyItemTemplate}" />

Редактировать

Если вы работаете в Silverlight4.0 или ниже, который не поддерживает привязки RelativeSource, затем присвойте тегу UserControl имя и используйте привязку ElementName

<UserControl x:Name="MyUserControl" ...>
    <ContentControl Template="{Binding ElementName=MyUserControl, Path=MyItemTemplate}" />
</UserControl>
1 голос
/ 01 декабря 2011

Хотя лучший ответ - Рэйчел, вот несколько альтернатив.

Если эта логика не критична, вам лучше поместить шаблон в ресурсы и получить его, используя StaticResource:

<UserControl>
  <UserControl.Resources>
    <ControlTemplate x:Key="template">
      ...
    </ControlTemplate>
  </UserControl.Resources>

  <ContentControl Template="{StaticResource template}"/>
</UserControl>

Если вам все еще нужно установить его из свойства UserControl, вы можете определить обратный вызов изменения. XAML:

<UserControl>
  <ContentControl x:Name="contentControl"/>
</UserControl>

Код-за:

public ControlTemplate MyContentControl
{
  get { return (ControlTemplate)GetValue(MyContentControlProperty); }
  set { SetValue(MyContentControlProperty, value); }
}

public static readonly DependencyProperty MyContentControlProperty =
  DependencyProperty.Register("MyContentControl", typeof(ControlTemplate), typeof(MyScroll), new PropertyMetadata(null, OnMyContentControlChanged));

static void OnMyContentControlChanged(object sender, DependencyPropertyChangedEventArgs e)
{
  var userControl = (MyScroll)sender;

  userControl.contentControl.Template = e.NewValue as ControlTemplate;
}

И последний вариант - с использованием пользовательского элемента управления . Код:

public class MyScroll : SomeParentControl
{
  public MyScroll()
  {
    this.DefaultStyleKey = typeof(MyScroll);
  }

  public ControlTemplate MyContentControl
  {
    get { return (ControlTemplate)GetValue(MyContentControlProperty); }
    set { SetValue(MyContentControlProperty, value); }
  }

  public static readonly DependencyProperty MyContentControlProperty =
    DependencyProperty.Register("MyContentControl", typeof(ControlTemplate), typeof(MyScroll), new PropertyMetadata(null));
}

Шаблон:

<!-- This is a template for what have been your UserControl -->
<ControlTemplate TargetType="{x:Type someNameSpaceAlias:MyScroll}">
  <!-- And this is the 'MyContentControl' -->
  <ContentControl Template="{TemplateBinding MyContentControl}"/>
</ControlTemplate>
1 голос
/ 01 декабря 2011

Пусть ваш шаблон является статическим ресурсом (определенным где-то в вашем XAML).

<DataTemplate x:Key="DetailedTemplate">

 <Border BorderBrush="Blue" Margin="3" Padding="3" BorderThickness="2" CornerRadius="5" Background="Beige">

 <StackPanel Orientation="Horizontal">

 <Image Margin="10" Width="250" Height="200" Stretch="Fill" Source="{Binding Path=ImageHref}">

 <Image.BitmapEffect>

 <DropShadowBitmapEffect />

 </Image.BitmapEffect>

 </Image>

 <StackPanel Orientation="Vertical" VerticalAlignment="Center">

 <TextBlock FontSize="25" Foreground="Goldenrod" Text="{Binding Path=ImageName}" />

 <Label Content="{Binding Path=ImageRating,Converter={StaticResource RatingConverter}}" />

 </StackPanel>

 </StackPanel>

 </Border>

</DataTemplate>



<DataTemplate x:Key="SimpleTemplate">

 <Border BorderBrush="Blue" Margin="3" Padding="3" BorderThickness="2" CornerRadius="5" Background="Beige">

 <StackPanel HorizontalAlignment="Center">

 <Image Margin="10" Width="250" Height="200" Stretch="Fill" Source="{Binding Path=ImageHref}">

 <Image.BitmapEffect>

 <DropShadowBitmapEffect />

 </Image.BitmapEffect>

 </Image>

 </StackPanel>

 </Border>

</DataTemplate>

Например, в XAML:

<ListBox x:Name="lbResults" Grid.Row="1" Grid.Column="0" Height="240" 

 HorizontalContentAlignment="Stretch" ItemsSource="{StaticResource FavoriteImages}" 

 ItemTemplate="{StaticResource SimpleTemplate}" />

Затем в коде что-то вроде:

//pull the detailed template from resources, identified by the DetailedTemplate key

 DataTemplate detail = this.FindResource("DetailedTemplate") as DataTemplate;

 lbResults.ItemTemplate = detail;

и

//pull the summary template from resources, identified by the SimpleTemplate key

 DataTemplate summary = this.FindResource("SimpleTemplate") as DataTemplate;

 lbResults.ItemTemplate = summary;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...