5

WPF アプリケーションでは、ViewModel から View の要素の可視性をトリガーする必要がある場合、基本的に 2 つの方法があります。

方法 1 : を使用するbool

class ViewModel
{
    public bool IsMyImageVisible { get; set; }
}

意見:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="booleanToVisibility" />
</Window.Resources>

<Image Visibility="{Binding IsMyImageVisible, Converter={StaticResource booleanToVisibility}}" />

方法 2 : を使用するVisibility

class ViewModel
{
    public Visibility MyImageVisibility { get; set; }
}

意見:

<Image Visibility="{Binding MyImageVisibility}" />

質問

  1. 「方法 2」はまだ MVVM に準拠していますか?

  2. どのような場合に「方法 1」を使用する必要がありますか?

編集:質問を意見に基づかないものに変更しました。

4

3 に答える 3

11

2 番目のオプションは、ViewModel を特定のテクノロジ (WPF) にバインドします。一部の Web フレームワークなどの別のテクノロジには、異なる Visibility 列挙があります。モデル プロジェクトに WPF 参照を追加する必要がある場合もありますが、これは一部のシナリオでは適切ではない可能性があります (そのプロジェクトのすべてのコンシューマーがその参照も含める必要があるため)。

ViewModel でフレームワーク間の互換性が必要ない場合は、他の欠点なしで 2 番目のものを使用できます。

于 2013-10-18T11:27:28.693 に答える
4

次のシナリオを検討してください。

次のインターフェイス設計の決定が行われます: 画像を非表示にする代わりに、幽霊のように %10 不透明にします。ここで、2 番目のオプションを選択した場合、インターフェイスのデザインが変更されたため、viewmodel コードを変更する必要があります。ただし、最初のオプションを選択した場合は、その変更を反映するようにインターフェイスを変更します (おそらく BoolToOpacity コンバーターを追加します)。最初のオプションは、MVVM の哲学に沿ったものです。また、インターフェイスの設計とビューモデルのコードに別々の人が取り組んでいる場合、お互いの作業に干渉する必要はありません。

于 2013-10-18T11:41:49.337 に答える
2

その物件をどうするかで決まると思います。アプリケーションの一部のビューでは、画像を表示/非表示にするだけかもしれませんが、別のビューを作成する場合、画像の可用性に基づいてまったく新しいテンプレートを表示したい場合があります。

その場合、Visibility プロパティが少し奇妙になります。

于 2013-10-18T11:27:20.297 に答える