2010-08-06 51 views
1

我已經得到了類似於此頁面上的一個列表框項的數據模板一個DataTemplate ... link上觸發數據更新時

我想借這一步,做當他們改變時突出物品的東西。例如,使用上面鏈接中的代碼,我想在Widget.Quantity更改時觸發某些操作。也許使quiantity項目(沒有別的)閃光什麼的。我怎樣才能做到這一點?我包括下面的相關代碼...

<Window.Resources> 
    <Style x:Key="RoundedItem" TargetType="ListBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ListBoxItem"> 
        <Border CornerRadius="10" BorderBrush="Black" BorderThickness="1" Margin="1"> 
         <ContentPresenter /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
    <DataTemplate DataType="{x:Type local:Widget}"> 
     <StackPanel Orientation="Horizontal"> 
      <Label Content="{Binding Name}" /> 
      <Label Content="{Binding Quantity}" /> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 
<ListBox ItemsSource="{Binding Widgets}" ItemContainerStyle="{StaticResource RoundedItem}" HorizontalContentAlignment="Stretch" /> 

回答

0

我設法使它與EventTriggers一起工作。完整的代碼如下。總之,事件觸發器檢測綁定值何時更改,然後簡短地將文本轉爲橙色。

<UserControl.Resources> 
    <!-- instantiate an instance of the TimeSettingsCollection class --> 
    <c:TimeSettingsCollection x:Key="TimeSettingsCollection"/> 

    <Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ListBoxItem"> 
        <Border Name="ItemBorder" BorderBrush="Gray" BorderThickness="1" Margin="3" Padding="7" Background="Transparent"> 
         <ContentPresenter /> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter TargetName="ItemBorder" Property="Background" Value="LightBlue" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <DataTemplate DataType="{x:Type c:TimeSettingsItem}"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="80"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 

      <TextBlock Grid.Row="0" Grid.Column="0" Margin="0,0,8,0" 
         Style="{StaticResource smallTitleStyle}">Pc Name:</TextBlock> 
      <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=PcName}" 
         Style="{StaticResource textStyleTextBlock}"/> 
      <TextBlock Grid.Row="1" Grid.Column="0" Margin="0,0,8,0" 
         Style="{StaticResource smallTitleStyle}">Time:</TextBlock> 
      <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=TimeSettings.DateTime, NotifyOnTargetUpdated=True}" 
         Style="{StaticResource textStyleTextBlock}" x:Name="timeTextBlock"> 
       <TextBlock.Background> 
        <SolidColorBrush Color="Transparent"/> 
       </TextBlock.Background> 
       <TextBlock.Triggers> 
        <EventTrigger RoutedEvent="Binding.TargetUpdated"> 
         <BeginStoryboard> 
          <Storyboard> 
           <ColorAnimation 
           Storyboard.TargetName="timeTextBlock" 
           Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" 
           To="Orange"    
           Duration="0:0:1" 
           AutoReverse="True"/> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger>      
       </TextBlock.Triggers> 
      </TextBlock> 
     </Grid> 
    </DataTemplate> 
</UserControl.Resources> 


<DockPanel> 
    <ListBox Name="timeListBox" ItemsSource="{Binding Source={StaticResource TimeSettingsCollection}}" ItemContainerStyle="{StaticResource ListBoxItemStyle}" HorizontalContentAlignment="Stretch" IsSynchronizedWithCurrentItem="True"> 
    </ListBox> 
</DockPanel> 
1

只需將觸發器添加到DataTemplate.Triggers集合。

<DataTemplate DataType="{x:Type local:Widget}"> 
    <StackPanel x:Name="panel" Orientation="Horizontal"> 
     <Label Content="{Binding Name}" /> 
     <Label Content="{Binding Quantity}" /> 
    </StackPanel> 

    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding SomeProperty}" Value="True"> 
      <Setter Property="Background" Value="Yellow" TargetName="panel" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 
+0

是的,我曾經使用過類似的事情之前得到的ListBoxItem的背景選擇了整個項目何時改變。我想要檢測項目內的某些內容何時發生變化,然後對該子項目應用某種效果。在給出的示例代碼中,我想知道何時

0

您可能想要在Widget類中添加一個屬性來完成該操作。或者,如果Widget是模型,您可能想要將其包裝在WidgetViewModel類中,並在其上具有「IsFlashing」屬性。然後設置觸發器,只要這個「IsFlashing」屬性爲真就觸發。

+0

我剛剛發現了EventTriggers,並認爲這是一條路,因爲我想在值發生變化時執行某些操作(不在乎值的大小)。 – flobadob 2010-08-06 15:19:40

+0

EventTriggers依賴於RoutedEvents,因此它不像掛鉤到虛擬機上的PropertyChanged或新事件那麼簡單。 – 2010-08-06 17:30:40