2011-11-16 113 views
0

我现在拥有的一切:触发设置控件的属性在控件模板

<Style TargetType="{x:Type ListBox}" x:Key="PhotoListBoxStyle"> 
    <Style.Triggers> 
     <Trigger Property="{Binding Path=IsChecked, ElementName=DetailView}" Value="False"> 
      <Setter TargetName="WrapPanelItem" Property="ItemHeight" Value="100" /> 
      <Setter TargetName="WrapPanelItem" Property="ItemWidth" Value="400" /> 
     </Trigger> 
    </Style.Triggers> 

    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListBox}" > 
       <WrapPanel Name="WrapPanelItem" Margin="5" IsItemsHost="True" Orientation="Horizontal" 
        ItemHeight="{Binding Value, ElementName=ZoomSlider }" 
        ItemWidth="{Binding Value, ElementName=ZoomSlider }" 
        VerticalAlignment="Top" HorizontalAlignment="Stretch" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

我得到的最接近是名称添加到WrapPanel尝试和它上面的触发参考,但无法找到目标名称。我也尝试创建连接到直接WrapPanel一个单独的样式,而是说使用这是它的父的PhotoListBoxStyle造成与控制问题:

<Style x:Key="WrapPanelSetter" TargetType="{x:Type WrapPanel}"> 
    <Setter Property="ItemHeight" Value="{Binding Value, ElementName=ZoomSlider }" /> 
    <Setter Property="ItemWidth" Value="{Binding Value, ElementName=ZoomSlider }" /> 
    <Setter Property="HorizontalAlignment" Value="Stretch" /> 
    <Setter Property="VerticalAlignment" Value="Top" /> 
    <Setter Property="Orientation" Value="Horizontal" /> 
    <Setter Property="Margin" Value="5" /> 

    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=IsChecked, ElementName=DetailView}" Value="False"> 
      <Setter Property="ItemHeight" Value="100" /> 
      <Setter Property="ItemWidth" Value="400" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

感谢您的帮助。如果有更好的选择,我更愿意尝试不同的方法!

回答

1

我可以使用的ControlTemplate内ControlTemplate.Triggers与在控件模板创建控件的的TargetName添加DataTrigger:

<Style TargetType="{x:Type ListBox}" x:Key="PhotoListBoxStyle"> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListBox}" > 
       <WrapPanel Name="WrapPanelItem" Margin="5" IsItemsHost="True" Orientation="Horizontal" 
        ItemHeight="{Binding Value, ElementName=ZoomSlider }" 
        ItemWidth="{Binding Value, ElementName=ZoomSlider }" 
        VerticalAlignment="Top" HorizontalAlignment="Stretch" /> 
       <ControlTemplate.Triggers> 
        <DataTrigger Binding="{Binding Path=IsChecked, ElementName=DetailView}" Value="False"> 
         <Setter TargetName="WrapPanelItem" Property="ItemHeight" Value="100" /> 
         <Setter TargetName="WrapPanelItem" Property="ItemWidth" Value="400" /> 
        </DataTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
0

在你WrapPanel风格,改变你的TriggerDataTrigger

触发器旨在根据切断电流UIElement的属性,同时DataTriggers是为了根据掀起了绑定到其他对象

<Style x:Key="WrapPanelSetter" TargetType="{x:Type WrapPanel}"> 
    <Setter Property="ItemHeight" Value="{Binding Value, ElementName=ZoomSlider }" /> 
    <Setter Property="ItemWidth" Value="{Binding Value, ElementName=ZoomSlider }" /> 
    <Setter Property="HorizontalAlignment" Value="Stretch" /> 
    <Setter Property="VerticalAlignment" Value="Top" /> 
    <Setter Property="Orientation" Value="Horizontal" /> 
    <Setter Property="Margin" Value="5" /> 

    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=IsChecked, ElementName=DetailView}" Value="False"> 
      <Setter Property="ItemHeight" Value="100" /> 
      <Setter Property="ItemWidth" Value="400" /> 
     </DataTrigger > 
    </Style.Triggers> 
</Style> 
+0

我实际上在我的项目中有这样的错误,不确定旧版本是如何得到的 - 但这并不影响手头的问题。如果我正确创建了该样式,我可以将其附加到WrapPanel,但是然后引用主样式PhotoListBoxStyle的控件将无法工作,并且说无法将字符串转换为system.windows.style。 – elbweb

+0

@elbweb通常我会看到那个错误,如果我忘记指定我的Style是一个StaticResource。例如,有时我会写'Style =“MyStyle”'而不是'Style =“{StaticResource MyStyle}”'。没有理由为什么设置''WrapPanel Style =“...”/>'会影响你的'PhotoListBoxStyle'。也许你可以发布完整的非工作代码? – Rachel

+0

我实际上找到了一个解决方案,而不必创建另一种风格。我可以在有问题的ControlTemplate中添加一个触发器,并像我最初尝试的那样通过TargetName引用想要更改的控制器。我将这添加为我的问题的解决方案。 – elbweb