2015-03-13 3 views
0

У меня есть DataTemplate ниже, который решает, что .png показать на основе DirType. В настоящее время, если мы получим DirType из 3, мы показываем ./images/file.pngИзменить DataTemplate в файле codebehind dynamcailly

<DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Path=DirType}" Value="0"> 
       <Setter Property="Image.Source" TargetName="img" Value="./Images/MyComputer.jpg"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=DirType}" Value="1"> 
       <Setter Property="Image.Source" TargetName="img" Value="./Images/diskdrive.png"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=DirType}" Value="2"> 
       <Setter Property="Image.Source" TargetName="img" Value="./Images/folder.png"></Setter> 
       <Setter Property="Text" TargetName="ObjType" Value="File Folder"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=DirType}" Value="3"> 
       <Setter Property="Image.Source" TargetName="img" Value="./Images/file.png"></Setter> 
       <Setter Property="Text" TargetName="ObjType" Value="{Binding Ext}"></Setter> 
       <Setter Property="Visibility" TargetName="ObjSize" Value="Visible"></Setter> 
       <Setter Property="Text" TargetName="ObjSize" Value="{Binding Size}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True" > 

      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

Затем я использую его в ListBox:

<ListBox x:Name="dirList" Grid.ColumnSpan="3" IsSynchronizedWithCurrentItem="True" 

      ItemTemplate="{StaticResource DirViewTemplate}" BorderThickness="0" 
      HorizontalContentAlignment="Left" VerticalContentAlignment="Top" 
      Grid.Column="0" Grid.Row="1" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
      SelectedItem="{Binding Path=CurrentItem,Mode=OneWayToSource}" 
      MouseDoubleClick="dirList_MouseDoubleClick" 
      KeyDown="dirList_KeyDown"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Horizontal" ItemWidth="220"></WrapPanel> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
    </ListBox> 

Теперь я хочу, чтобы динамически изменять изображение, отображаемое для значения типа файла = 3 на основе их типов файлов. Прежде чем все файлы имеют одинаковый значок, отображаемый в списке, но теперь я хочу, чтобы они вытаскивали значки, отображаемые в проводнике Windows. Я пытался динамически обращаться к DataTemplate при добавлении элементов в список, но я не мог заставить его работать.

Любые советы?

+0

Попробуйте несколько триггеров. – sthotakura

ответ

0

Использовать MultiDataTrigger. Это определяет ряд условий, все из которых оцениваются в true для применений триггеров.

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding Path=DirType}" Value="3" /> 
     <Condition Binding="{Binding Path=Ext}" Value="txt" /> 
    </MultiDataTrigger.Conditions> 
    <Setter TargetName="img" Property="Source" Value="./Images/txt-file.png" /> 
</MultiDataTrigger> 

Здесь у вас есть два условия, одно связанных со значением DirType собственностью, другая привязана к стоимости Ext имущества. Если DirType - «3», а Ext - «txt», тогда будет применен сеттер (то есть, источник изображения изменится, чтобы использовать другой файл изображения).

Просто повторите триггер в XAML, изменив значения привязки, чтобы иметь дело с другими типами файлов.

Смежные вопросы