2013-10-31 57 views
1

我有这样定义的列表框:如何将模板中的TextBlock(定义ListBox的ListBoxItem)绑定到父ListBoxItem的IsSelected属性?

<ListBox x:Name="EmailList" 
    ItemsSource="{Binding MailBoxManager.Inbox.EmailList}" 
    SelectedItem="{Binding SelectedMessage, Mode=TwoWay}" 
    Grid.Row="1"> 

    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <usrctrls:MessageSummary /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

的用户控件的定义如下:

<UserControl x:Class="UserControls.MessageSummary" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     d:DesignHeight="300" 
     d:DesignWidth="600"> 

<UserControl.Resources> 
</UserControl.Resources> 

<Grid 
     HorizontalAlignment="Left"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="50" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <CheckBox Grid.Column="0" 
       VerticalAlignment="Center" /> 

    <Grid Grid.Column="1" Margin="0,0,12,0"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <Grid Grid.Row="0" 
       Grid.Column="0" 
       HorizontalAlignment="Stretch"> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="30" /> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="80" /> 
       <ColumnDefinition Width="80" /> 
      </Grid.ColumnDefinitions> 

      <Image x:Name="FlaggedImage" 
        Grid.Column="0" 
        Width="20" 
        Height="10" 
        Margin="0" 
        VerticalAlignment="Center" 
        HorizontalAlignment="Center" 
        Source="/Assets/ico_flagged_white.png" /> 

      <TextBlock x:Name="Sender" 
         Grid.Column="1" 
         Text="{Binding EmailProperties.DisplayFrom}" 
         Style="{StaticResource TextBlock_SenderRowTitle}" 
         HorizontalAlignment="Left" VerticalAlignment="Center" /> 

      <Grid x:Name="ImagesContainer" 
        Grid.Column="2" VerticalAlignment="Center"> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 

       <Image x:Name="ImgImportant" 
         Grid.Column="0" 
         Width="20" 
         Height="20" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Center" 
         Source="ms-appx:///Assets/ico_important_red.png" /> 

       <Image x:Name="ImgFolders" 
         Grid.Column="1" 
         Width="20" 
         Height="20" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Center" 
         Source="ms-appx:///Assets/ico_ico_addtofolder.png" /> 

       <Image x:Name="ImgAttachment" 
         Grid.Column="2" 
         Width="20" 
         Height="20" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Center" 
         Source="ms-appx:///Assets/ico_attachment_lightgray.png" /> 

       <Image x:Name="ImgFlag" 
         Grid.Column="3" 
         Width="20" 
         Height="20" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Center" 
         Source="ms-appx:///Assets/ico_flag.png" /> 
      </Grid> 

      <TextBlock x:Name="Time" 
         Grid.Column="3" 
         Text="{Binding EmailProperties.DateReceived, Converter={StaticResource EmailHeaderTimeConverter}}" 
         TextAlignment="Center" 
         FontSize="16" VerticalAlignment="Center" Margin="0" /> 
     </Grid> 

     <TextBlock Grid.Row="1" 
        Text="{Binding EmailProperties.Subject}" 
        TextTrimming="WordEllipsis" 
        Margin="0,10" /> 

     <TextBlock Grid.Row="2" 
        Text="{Binding EmailProperties.Preview}" 
        TextTrimming="WordEllipsis" /> 
    </Grid> 

</Grid> 

的MessageSummary是一个用户控件。我想将ListBoxItems的前景色绑定到该项是否是ListBox中选定的一个(IsSelectd属性),即我希望ListBoxItem的前景色(TextBlocks)在未选中时为黑色,如果为ListBoxItem则为蓝色被选中。

怎么办?

谢谢,

+0

问题的标题是否与完整的问题文本相关? –

+0

修改问题/标题以使其更清楚。 Thx –

回答

1

下面的代码证明了这一点。要将颜色传递到您的自定义控件,您需要定义ListBoxItemTemplate。您的控制必须公开前景属性,该属性将被绑定到TemplatedParent'sForeground。在您的控制内部,您必须将TextBox绑定到控件的Foreground。这是我看到这可以完成的唯一方法。

<Page 
    x:Class="App1.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="using:App1" 
    mc:Ignorable="d"> 
    <Page.Resources> 
     <!-- Default style for Windows.UI.Xaml.Controls.ListBoxItem --> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Background" Value="Transparent" /> 
      <Setter Property="TabNavigation" Value="Local" /> 
      <Setter Property="Padding" Value="8,10" /> 
      <Setter Property="HorizontalContentAlignment" Value="Left" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <Border x:Name="LayoutRoot" 
          Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
          <VisualStateManager.VisualStateGroups> 
           <VisualStateGroup x:Name="CommonStates"> 
            <VisualState x:Name="Normal" /> 
            <VisualState x:Name="PointerOver"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" 
                     Storyboard.TargetProperty="Background"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ListBoxItemPointerOverBackgroundThemeBrush}" /> 
              </ObjectAnimationUsingKeyFrames> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
                     Storyboard.TargetProperty="Foreground"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Disabled"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" 
                     Storyboard.TargetProperty="Background"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent" /> 
              </ObjectAnimationUsingKeyFrames> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
                     Storyboard.TargetProperty="Foreground"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Pressed"> 
             <Storyboard> 
              <DoubleAnimation Storyboard.TargetName="PressedBackground" 
                 Storyboard.TargetProperty="Opacity" 
                 To="1" 
                 Duration="0" /> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
                     Storyboard.TargetProperty="Foreground"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
           </VisualStateGroup> 
           <VisualStateGroup x:Name="SelectionStates"> 
            <VisualState x:Name="Unselected" /> 
            <VisualState x:Name="Selected"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid" 
                     Storyboard.TargetProperty="Background"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ListBoxItemSelectedBackgroundThemeBrush}" /> 
              </ObjectAnimationUsingKeyFrames> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
                     Storyboard.TargetProperty="Foreground"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="SelectedUnfocused"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid" 
                     Storyboard.TargetProperty="Background"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ListBoxItemSelectedBackgroundThemeBrush}" /> 
              </ObjectAnimationUsingKeyFrames> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
                     Storyboard.TargetProperty="Foreground"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="SelectedDisabled"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid" 
                     Storyboard.TargetProperty="Background"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ListBoxItemSelectedDisabledBackgroundThemeBrush}" /> 
              </ObjectAnimationUsingKeyFrames> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
                     Storyboard.TargetProperty="Foreground"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="SelectedPointerOver"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid" 
                     Storyboard.TargetProperty="Background"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ListBoxItemSelectedPointerOverBackgroundThemeBrush}" /> 
              </ObjectAnimationUsingKeyFrames> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
                     Storyboard.TargetProperty="Foreground"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="SelectedPressed"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="InnerGrid" 
                     Storyboard.TargetProperty="Background"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ListBoxItemSelectedBackgroundThemeBrush}" /> 
              </ObjectAnimationUsingKeyFrames> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
                     Storyboard.TargetProperty="Foreground"> 
               <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
           </VisualStateGroup> 
           <VisualStateGroup x:Name="FocusStates"> 
            <VisualState x:Name="Focused"> 
             <Storyboard> 
              <DoubleAnimation Storyboard.TargetName="FocusVisualWhite" 
                 Storyboard.TargetProperty="Opacity" 
                 To="1" 
                 Duration="0" /> 
              <DoubleAnimation Storyboard.TargetName="FocusVisualBlack" 
                 Storyboard.TargetProperty="Opacity" 
                 To="1" 
                 Duration="0" /> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Unfocused" /> 
            <VisualState x:Name="PointerFocused" /> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 
          <Grid x:Name="InnerGrid" 
           Background="Transparent"> 
           <Rectangle x:Name="PressedBackground" 
             Fill="{StaticResource ListBoxItemPressedBackgroundThemeBrush}" 
             Opacity="0" /> 
           <ContentPresenter x:Name="ContentPresenter" 
               Content="{TemplateBinding Content}" 
               ContentTransitions="{TemplateBinding ContentTransitions}" 
               ContentTemplate="{TemplateBinding ContentTemplate}" 
               HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
               VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
               Margin="{TemplateBinding Padding}" /> 

           <Rectangle x:Name="FocusVisualWhite" 
             Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}" 
             StrokeEndLineCap="Square" 
             StrokeDashArray="1,1" 
             Opacity="0" 
             StrokeDashOffset=".5" /> 
           <Rectangle x:Name="FocusVisualBlack" 
             Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}" 
             StrokeEndLineCap="Square" 
             StrokeDashArray="1,1" 
             Opacity="0" 
             StrokeDashOffset="1.5" /> 
          </Grid> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Page.Resources> 

    <Grid> 
     <ListBox> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <usrctrls:MessageSummary Foreground = {Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}} /> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      <ListBoxItem >Item1</ListBoxItem> 
      <ListBoxItem >Item2</ListBoxItem> 
      <ListBoxItem >Item3</ListBoxItem> 
     </ListBox> 
    </Grid> 
</Page> 
+0

我认为你不能在ListBox风格上设置触发器,至少编译器尖叫关于那个:( –

+0

什么是错误信息?代码对我来说工作得很好 –

+0

WinRT中没有触发器/ DataTrigger。 ?。在Windows 8的WinRT应用 –

相关问题