绑定为转换器内部创建了多少个实例。
<Image x:Uid="DisplayedImageUrl" Style="{StaticResource ImageStyle}"
Source="{Binding DisplayedImageURL, Converter={StaticResource ImageLogoConverter}}" />
ImageLogoConverter将有多少个实例?
在ViewModel中使用转换器是个好主意,如果不是,那么访问ViewModel属性的转换值的最佳方法是什么。
答案 0 :(得分:1)
在ViewModel中使用转换器好吗?
不。为什么要在视图模型中使用转换器,以便直接返回转换后的值?视图中使用转换器,通常用于转换视图模型返回的非视图友好值。
如果不是,那么访问ViewModel属性的转换值的最佳方法是什么?
您可以简单地从视图模型返回已转换的值,即,可以直接绑定到ImageSource
属性,而不是绑定到ItemsControl
属性。
例如,如果您打算在<td class="mat-cell mat-column-detail logo-detail-detail">
<mat-icon class="blue-theme example-icon logo-ayant-droit-keyboard"
svgIcon="logo-ayant-droit-keyboard" (click)="show=!show">{{show ? 'hide' : 'show'}}</mat-icon>
</td>
</ng-container>
</tr>
<tr *ngIf="show" style="background-color:lightgray">
<td colspan="99">
<app-etat-civil [context]="SectionContext.DISPLAY" [model]="sousDossierService.getSousDossierAyantDroit(dossier?.sousDossiers)?.individu"></app-etat-civil>
</td>
</tr>
中显示很多元素,这是推荐的方法。那么出于性能原因,您可能不想为每个可见元素调用转换器。
答案 1 :(得分:0)
我想您将转换器创建为这样的资源:
实例数现在取决于声明转换器资源的范围。如果您在<Page.Resources>
中创建它,则将创建一个实例供页面使用。如果您在App.xaml
的{{1}}中创建它,它将是一个应用程序范围的实例。当然,您甚至可以使用更窄的范围-例如在XAML树中将其创建为单个控件的资源-在任何情况下,创建父实例时都将创建一个实例。
如果将其嵌入到列表控件的<Application.Resources>
中,情况将变得更加有趣。由于有了虚拟化,系统实际上不会为每个项目创建一个实例。取而代之的是,它将仅创建足够适合屏幕显示的实例,并且在用户滚动时会重新使用它们。
某些MVVM开发人员不喜欢价值转换器,但其他人则广泛使用它们。这确实是一个偏好问题。在cas中,您希望基础数据经常更改,因此建议将代码在UI线程上运行时,使其尽可能保持高性能。