如何命名DataTriggered UserControl以使其可见?

时间:2013-10-11 09:06:05

标签: wpf

我在布局中有以下内容:

<ContentControl>
  <ContentControl.Style>
    <Style TargetType="{x:Type ContentControl}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding CurrentPane}" Value="Pane1">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="{x:Type ContentControl}">
                <uc:UserControl x:Name="?????" />

简单来说,UserControl基于Template加载到DataTrigger。这一切都很有效,除了一件事:无论我如何命名这个UserControl以便它出现在主布局中,它都不会出现。我需要获得对控件的引用,以便我可以将事件处理程序附加到它。

如果有另外一个关于如何从主布局到达UserControl而没有专门命名的想法,那也是一个解决方案。

2 个答案:

答案 0 :(得分:2)

您需要命名ContentControl并从ControlTemplate属性中获取Template,然后您可以使用FindName方法访问UserControl <ContentControl Name="YourContentControl"> <ContentControl.Style> <Style TargetType="{x:Type ContentControl}"> <Style.Triggers> <DataTrigger Binding="{Binding CurrentPane}" Value="Pane1"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ContentControl}"> <uc:UserControl x:Name="YourUserControl" /> 1}}:

ControlTemplate yourTemplate = YourContentControl.Template;
UserControl yourUserControl = 
    (UserControl)yourTemplate.FindName("YourUserControl", YourContentControl);
if (yourUserControl != null)
{
    // do something with your control here
}

然后在代码中:

UserControl

当然,如果您在Template尚未设置为null时使用此代码,则会出现错误。因此,您应该检查{{1}}:

答案 1 :(得分:0)

我是这样看的:在定义Template属性时你正在做的是定义class以在wpf模板control时实例化。 uc:UserControl不是对实例的引用,因此您无法使用x:Name属性引用它。

如果你在一个单独的资源中定义了ControlTemplate,也许更容易看到它不是一个实例:

<ControlTemplate x:Key="MyControlTemplate">
  <uc:UserControl x:Name="MyUC">
</ControlTemplate>

<ContentControl x:Name="MyFirstContentControl">
  <ContentControl.Style>
    <Style TargetType="{x:Type ContentControl}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding CurrentPane}" Value="Pane1">
          <Setter Property="Template" Value="{StaticResource MyControlTemplate}">
 [...]

<ContentControl x:Name="MySecondContentControl">
  <ContentControl.Style>
    <Style TargetType="{x:Type ContentControl}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding CurrentPane}" Value="Pane1">
          <Setter Property="Template" Value="{StaticResource MyControlTemplate}">

[...]

现在,如果您引用“MyUC”,它会引用两个实例中的哪一个? UserControl内的MyFirstContentControl模板或MySecondContentControl内的模板?这就是为什么你必须像Sheridan解释的那样动态地寻找像(psoeudo代码)MyFirstControl.MyUC这样的东西。