2010-03-18 5 views
3

개체에 바인딩 된 WPF UI가 있습니다. 그것은이 작동값 변환기를 사용하는 바인딩 새로 고침

 

    <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> 
 

: 요소는 이미지가 2 층에있는 트 리뷰는

 

    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; 
     } 
    } 
 

: 나는 비즈니스 규칙에 의해 특정 이미지에 속성을 변환하는 ValueConverter를 사용하고 있습니다 좋아,하지만 나중에 개체의 상태가 변경되면 이미지를 새로 고치고 값 변환기를 다시 평가하려고합니다. 이것이 어떻게 가능한지?

답변

3

변환기 내에서 하나의 값만 사용하는 것처럼 보입니다. 두 값 사이를 간단하게 전환하는 것처럼 보이므로 트리거를 사용하여 XAML에서 직접이 작업을 수행 할 수 있습니다. 또한이 메서드는 Invoice 속성에 대한 바인딩으로 전환하므로 해당 속성에 대한 변경 알림으로 인해 트리거가 업데이트됩니다.

<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

감사합니다. 이것은 매력처럼 작동했습니다. –

3

전체 개체에 바인딩하기 때문에 INotifyPropertyChanged를 사용할 수 없다고 가정하면 BindingExpression.UpdateTarget을 호출해야합니다.

약간의 미묘함이 바인딩 표현식을 가져 오는 중입니다. 이 뷰의 상당히 친밀한 지식을 가지고 당신이 필요합니다 제어 및 재산 누구의 업데이트 할 바인딩을 전달, 지금까지의 내가 아는 한,이 작업을 수행 할 수있는 유일한 방법은 BindingOperations.GetBindingExpression를 호출하는 것입니다 예 :

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

UI 에서조차도 여전히 약간 복잡합니다. 바인딩 된 요소는 TreeView이며 2 단계에서 이미지를 새로 고침하고 싶습니다. 위의 UI 코드를 추가했습니다. –

관련 문제