2015-11-06 60 views
2

我有如下因素代码,我能够重构:WPF崩VS重新绑定

<HierarchicalDataTemplate DataType = "{x:Type data:FieldMapping}" 
          ItemsSource = "{Binding Path=FieldMappingItems}"> 
    <Grid Name="MainGrid" > 
     <Grid.ToolTip > 
      <TextBlock Name="Tt" Text="{Binding Path=ToolTip}"/> 
     </Grid.ToolTip> 
     <Grid.ColumnDefinitions > 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <TextBlock Name="Error" Margin="0,0,5,0" TextElement.FontWeight="Bold" TextElement.Foreground="Red" Visibility="Collapsed" Text="!"/> 
     <StackPanel Grid.Column="1" > 
      <Image Source="../../icons\column.png" Name="Image"/> 
      <Image Source="../../icons\Connect.png" Name="SourceImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\Service.png" Name="AttritubeImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\table.png" Name="SearchImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\surrogateKey.png" Name="TargetImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\Key16.png" Name="PrimayKeyImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\tempTable.png" Name="TempTableImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\Component16.png" Name="SPImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\DatabaseSelectCellSecure16.png" Name="RootImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\Console16.png" Name="ScriptImage" Visibility="Collapsed"/> 
      <Image Source="../../icons\CodeWindowSelect16.png" Name="ProgramImage" Visibility="Collapsed"/> 

     </StackPanel> 
     <TextBlock Name="tb" Margin="2,0,0,0" Grid.Column="2" Text="{Binding Path=FieldName}"/> 
     <TextBlock Name="tbSource" Margin="2,0,0,0" Visibility="Collapsed" Grid.Column="2" Text="{Binding Path=FullNodePath}"/> 
    </Grid> 
    <DataTemplate.Triggers>    
     <MultiDataTrigger > 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding Path=Published}" Value="False"/> 
       <Condition Binding="{Binding Path=FieldMappingType}" Value="TempTable"/> 
      </MultiDataTrigger.Conditions> 
      <Setter TargetName="tb" Property="FontStyle" Value="Italic"/> 
     </MultiDataTrigger> 
     <DataTrigger Binding="{Binding Path=Active}" Value="False"> 
      <Setter TargetName="MainGrid" Property="Opacity" Value="0.5"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=IsPrimaryKey}" Value="True"> 
      <Setter TargetName="tb" Property="Margin" Value="4,0,0,0"/> 
      <Setter TargetName="Image" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="PrimayKeyImage" Property="Visibility" Value="Visible"/> 
      <Setter TargetName="SourceImage" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="TargetImage" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="RootImage" Property="Visibility" Value="Collapsed"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=FieldMappingType}" Value="Table"> 
      <Setter TargetName="tb" Property="Margin" Value="4,0,0,0"/> 
      <Setter TargetName="Image" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="SourceImage" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="PrimayKeyImage" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="TargetImage" Property="Visibility" Value="Visible"/> 
      <Setter TargetName="RootImage" Property="Visibility" Value="Collapsed"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=FieldMappingType}" Value="TempTable"> 
      <Setter TargetName="tb" Property="Margin" Value="4,0,0,0"/> 
      <Setter TargetName="Image" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="SourceImage" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="PrimayKeyImage" Property="Visibility" Value="Collapsed"/> 
      <Setter TargetName="TempTableImage" Property="Visibility" Value="Visible"/> 
      <Setter TargetName="RootImage" Property="Visibility" Value="Collapsed"/> 
      <!--<Setter TargetName="tb" Property="Margin" Value="15,0,0,0"/>--> 
     </DataTrigger> 
</HierarchicalDataTemplate> 

正如你可以看到有大量的图片被倒塌后,根据不同的类型的对象,显示期望的图像。

我明白,这是一个烂摊子,我在下面的方式重构它:

<Grid Name="MainGrid"> 
       <Grid.ToolTip> 
        <TextBlock Name="Tt" Text="{Binding Path=ToolTip}" /> 
       </Grid.ToolTip> 

       <StackPanel Orientation="Horizontal"> 
        <TextBlock x:Name="Error" Margin="0,0,5,0" TextElement.FontWeight="Bold" TextElement.Foreground="Red" Visibility="{Binding Path=Warning, Converter={StaticResource BooleanToVisibility}}" Text="!"/> 
        <Image x:Name="Icon" Source="../../icons\column.png" /> 
        <TextBlock x:Name="tb" Margin="2,0,0,0" Text="{Binding Path=FieldName}" /> 
       </StackPanel> 

      </Grid> 
      <DataTemplate.Triggers> 

       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Path=Published}" Value="False" /> 
         <Condition Binding="{Binding Path=FieldMappingType}" Value="TempTable" /> 
        </MultiDataTrigger.Conditions> 
        <Setter TargetName="tb" Property="FontStyle" Value="Italic" /> 
       </MultiDataTrigger> 

       <DataTrigger Binding="{Binding Path=Active}" Value="False"> 
        <Setter TargetName="MainGrid" Property="Opacity" Value="0.5" /> 
       </DataTrigger> 

       <DataTrigger Binding="{Binding Path=IsPrimaryKey}" Value="True"> 
        <Setter TargetName="tb" Property="Margin" Value="4,0,0,0" /> 
        <Setter TargetName="Icon" Property="Source" Value="../../Icons/Key16.png" /> 
       </DataTrigger> 

       <DataTrigger Binding="{Binding Path=FieldMappingType}" Value="TempTable"> 
        <Setter TargetName="tb" Property="Margin" Value="4,0,0,0" /> 
        <Setter TargetName="Icon" Property="Source" Value="../../Icons/tempTable.png" /> 
       </DataTrigger> 

虽然我的重构是更容易消化,更succint,我在想,如果我通过改变获得更好的性能绑定单个图像而不是切换多个图像的可视性。

回答

0

它总是更高效地折叠/显示,而不是更改绑定。如果应用程序真的在速度上挣扎,这是一个简单的胜利。

原因是,当绑定被改变时,幕后的WPF必须重新生成整个可视化树。这很慢。如果WPF正在折叠/显示可视化树的部分内容,那么它会进行一些有效的优化,从而使此操作变得非常快速。讽刺的是,更改绑定直观地吸引了程序员,而C#通常更易于阅读和更优雅。

更新

此规则仅适用于销毁/创建巨大的可视树。如果您的应用程序速度慢,那么将其视为优化,否则应避免将其编程为更多工作​​。

+0

你有任何文件来支持这个,因为这看起来非常直观。 – d347hm4n

+0

没有文档,这是根据经验。每次我们切换标签页时,应用程序初稿都冻结了3秒,这几乎不可用。第二稿使用隐藏/显示而不是交换ViewModels,它是瞬时的。 – Contango

+0

在你描述的场景中,这似乎是一个合理的预期。我想知道对象是否会被存储在内存中呢?如果您在切换开关上看到即时响应,我会期待他们。因为这些都是树状视图中的所有节点,并且我可以有很多节点。我不想分配太多的记忆,因为他们的状态不会经常变化。 – d347hm4n