ContentControl模板通过Property

时间:2011-12-01 14:50:06

标签: wpf silverlight xaml

我有一个带有ControlTemplate DependencyProperty的Usercontrol(名为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()));

在我的UserControl的xaml中,我想使用“MyItemTemplate”作为ContentControl的模板,如下所示:

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

我知道 Template =“{Binding MyItemTemplate}” 是错误的,但我不知道该怎么做......

由于

3 个答案:

答案 0 :(得分:4)

您可以使用RelativeSource绑定在UserControl上引用自定义DependencyProperty

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

修改

如果您使用的是不支持RelativeSource绑定的Silverlight 4.0或更低版本,请为您的UserControl代码指定名称并使用ElementName绑定

<UserControl x:Name="MyUserControl" ...>
    <ContentControl Template="{Binding ElementName=MyUserControl, Path=MyItemTemplate}" />
</UserControl>

答案 1 :(得分:1)

将您的模板作为静态资源(在您的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;

答案 2 :(得分:1)

虽然最好的答案是雷切尔,但这里有一些替代方案。

如果这个逻辑不重要,您最好将模板放入资源并使用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;
}

最后一个选项是using a Custom Control。 代码:

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>