2010-03-18 7 views
3

J'ai une interface utilisateur WPF liée à un objet. J'utilise un ValueConverter pour convertir une propriété à une image spécifique par une règle métier:Actualisation d'une liaison utilisant un convertisseur de valeur

 

    public class ProposalStateImageConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var proposal = value as Proposal; 
      var basePath = "pack://application:,,,/ePub.Content;component/Images/General/Flag_{0}.png"; 
      string imagePath; 

      if(proposal.Invoice != null) 
      { 
       imagePath = string.Format(basePath, "Good"); 
      } 
      else 
      { 
       imagePath = string.Format(basePath, "Warning"); 
      } 

      var uri = new Uri(imagePath); 
      var src = uri.GetImageSource(); //Extention method 

      return src; 
     } 
    } 
 

L'élément est un TreeView où l'image est au 2ème niveau:

 

    <TreeView x:Name="tree" 
       ItemsSource="{Binding People}" 
       SelectedItemChanged="OnTreeItemChanged"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type dmn:Person}" 
             ItemsSource="{Binding Proposals}"> 
       <StackPanel Orientation="Horizontal" ToolTip="{Binding Path=Fullname}" Margin="3"> 
        <Image Margin="5,0,5,0" Width="16" Height="16" Source="pack://application:,,,/ePub.Content;component/Images/General/Person_Active.png" /> 
        <TextBlock Text="{Binding Path=Firstname}" /> 
        <TextBlock Text="{Binding Path=Lastname}" Margin="5,0,0,0" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type dmn:Proposal}"> 
       <StackPanel Orientation="Horizontal" Margin="3"> 
        <Image x:Name="invoiceImage" Width="16" Height="16" Margin="5,0,5,0" Source="{Binding, Converter={StaticResource ProposalStateImageConverter}, UpdateSourceTrigger=PropertyChanged}" /> 
        <TextBlock Text="{Binding DeliveryDate, Converter={StaticResource textCulturedDateConverter}}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 
 

Il travaille bien, mais plus tard, quand l'état de l'objet change, je veux rafraîchir l'image et réévaluer le convertisseur de valeur. Comment est-ce possible?

Répondre

3

Il semble que vous n'utilisiez qu'une seule valeur dans le convertisseur et que vous ne faisiez qu'un simple basculement entre deux valeurs pour que vous puissiez le faire directement en XAML avec un trigger. Cette méthode bascule également vers une propriété Binding against the Invoice afin que toute notification de modification pour cette propriété entraîne la mise à jour du déclencheur.

<HierarchicalDataTemplate > 
    <StackPanel Orientation="Horizontal" Margin="3"> 
     <Image x:Name="invoiceImage" Width="16" Height="16" Margin="5,0,5,0" Source="good.png"/> 
     <TextBlock ... /> 
    </StackPanel> 
    <HierarchicalDataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Invoice}" Value="{x:Null}"> 
      <Setter TargetName="invoiceImage" Property="Source" Value="warning.png"/> 
     </DataTrigger> 
    </HierarchicalDataTemplate.Triggers> 
</HierarchicalDataTemplate> 
+0

Merci, cela a fonctionné comme un charme. –

3

En supposant que vous ne pouvez pas utiliser INotifyPropertyChanged parce que vous liez l'objet entier, vous devez appeler BindingExpression.UpdateTarget.

La légère subtilité consiste à obtenir l'expression de liaison. Cela vous oblige à avoir une connaissance assez intime de la vue: pour autant que je sache, la seule façon de le faire est d'appeler BindingOperations.GetBindingExpression, en passant le contrôle et la propriété dont vous liant souhaitez mettre à jour, par exemple:

BindingOperations.GetBindingExpression(myImage, Image.SourceProperty).UpdateTarget(); 
+0

Il est encore un peu compliqué de le faire même sur l'interface utilisateur. l'élément qui est lié est un TreeView et je veux rafraîchir l'image au 2ème niveau. J'ai ajouté le code de l'interface ci-dessus. –

Questions connexes