1

これがxamlに実装したいものの擬似コードです

IF vm.AvatarFilePath IS NOT NULL THEN
    Image.Source = {Binding AvatarPath}
ELSE
    If vm.Gender == {x:Static vm:Gender.Female} THEN
        Image.Source = {StaticResource Img_Female}
    ELSE
        Image.Source = {StaticResource Img_Male}
    ENDIF
ENDIF

以下は、少なくとも次の問題を伴う実装の試みです。

  1. AvatarPathがnullであり、性別を気にしていることをどのようにして知ることができますか?
  2. ELSEを実行する方法があるので、Gender.Maleリソースを1回ずつではなく1回だけ指定できます。

これを適切に実装するにはどうすればよいですか?

乾杯、
ベリール

xaml試行1

<DataTemplate x:Key="AvatarPathTemplate">
    <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}">
            <Setter Property="Sourrce" Value="{resx:Resx Img_Female}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Male}">
            <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Unknown}">
            <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Unspecified}">
            <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/>
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

アップデート

Trimeykoが指摘しているように、これはマルチコンバーターを使用するか、ビューモデルの内部で行うことができます。

私の回答によると、「最初はマルチコンバーターのアプローチを試しましたが、ある程度の成功を収めましたが、それをクリーンアップするためにほぼ投稿しました。その後、コンバーターは実際にタイプを変換するのが最善であると判断しました。ビューモデルアプローチがおそらく最も簡単であることに同意しました。しかし、これはビューの仕事のように思われるので、最初にそのように機能させることができるかどうかを確認したいと思います。」

[ここにmutliConveterを投稿してこれを解決する](MultiConverterの使用法)を試みました

4

2 に答える 2

4

MultiDataTriggerあなたはいくつかのsでこれを行うことができるはずです :

<DataTemplate x:Key="AvatarPathTemplate">
    <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/>
    <DataTemplate.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" />
                <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Source" Value="{resx:Resx Img_Female}"/>
        </MultiDataTrigger>

        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" />
                <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Male}"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Source" Value="{resx:Resx Img_Male}"/>
        </MultiDataTrigger>
        <!-- etc... -->
    </DataTemplate.Triggers>
</DataTemplate>

これらは、「AvatarPathがnullGenderであり、女性である場合...」と述べています。

さらなる改善

DataTriggersはXAMLに表示される順序で適用されるため、以下の例では、「男性」設定を複製する必要をなくすことができます。

<DataTemplate x:Key="AvatarPathTemplate">
    <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding AvatarPath}" Value="{x:Null}">
            <Setter Property="Source" Value="{resx:Resx Img_Male}"/>
        </DataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" />
                <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Source" Value="{resx:Resx Img_Female}"/>
        </MultiDataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

ここで私たちは言っています:

  1. ソースをに設定しますAvatarPath
  2. nullの場合AvatarPath、ソースを「Img_Male」に設定します
  3. AvatarPathがnullで、が女性の場合Gender、ソースを「Img_Female」に設定します
于 2012-05-17T15:06:25.520 に答える
1

オプションとして、カスタムコンバータークラスを使用して、viewmodelをビットマップソースに変換できます。トリガーを使用する場合は、たとえばImg_Maleを表示する場合に、いくつかのマルチデータトリガーやマルチコンバーターを使用できます。

しかし、これらのソリューションはあまり良くないと思います。プロパティ/ロジックを導入し、画像ソースをそれにバインドして、viewmodel内でこれらのビューロジックを処理する方がよいと思います。このアプローチを使用すると、このロジックの単体テストを作成することもできます。

于 2012-05-17T13:05:05.237 に答える