在UWP

时间:2019-07-02 06:09:54

标签: mvvm uwp uwp-xaml

绑定为转换器内部创建了多少个实例。

<Image x:Uid="DisplayedImageUrl" Style="{StaticResource ImageStyle}" 
      Source="{Binding DisplayedImageURL, Converter={StaticResource ImageLogoConverter}}" />

ImageLogoConverter将有多少个实例?

在ViewModel中使用转换器是个好主意,如果不是,那么访问ViewModel属性的转换值的最佳方法是什么。

2 个答案:

答案 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线程上运行时,使其尽可能保持高性能。