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,我在想,如果我通过改变获得更好的性能绑定单个图像而不是切换多个图像的可视性。
你有任何文件来支持这个,因为这看起来非常直观。 – d347hm4n
没有文档,这是根据经验。每次我们切换标签页时,应用程序初稿都冻结了3秒,这几乎不可用。第二稿使用隐藏/显示而不是交换ViewModels,它是瞬时的。 – Contango
在你描述的场景中,这似乎是一个合理的预期。我想知道对象是否会被存储在内存中呢?如果您在切换开关上看到即时响应,我会期待他们。因为这些都是树状视图中的所有节点,并且我可以有很多节点。我不想分配太多的记忆,因为他们的状态不会经常变化。 – d347hm4n