0

私はSilverlightにカスタムUserControlを持っていますが、これは単純にTextBlocksとTextBoxesで構成されています。次のようなクラスエンティティの階層があります。

  • Personは、NameとAgeのプロパティを含む抽象的なスーパークラスです。
  • Manは、FacialFeatureプロパティを追加するPersonの子です。
  • 女性は、LastMenstruatedプロパティとHasHymenプロパティを追加するPersonの子です。

それで:

  • Personには、NameとAgeのプロパティが含まれています
  • 男性には、Name、Age、FacialFeatureのプロパティが含まれています
  • 女性には、Name、Age、LastMenstruated、HasHymenのプロパティが含まれています

私が欲しいのは、UserControlがこれらのプロパティの値を次のように単純に表示することです。

PersonがManタイプの場合:

Name : Mark
Age : 23
FacialFeature : Fully Shaved

または、PersonがWomanタイプの場合:

Name : Jane
Age : 8
LastMenstruated : Never
HasHymen : Yes

これは私の質問のための単純化された例であることを覚えておいてください。

私が欲しいのは、UserControlが異なる情報を表示し、実行時のPersonのタイプに応じて異なる情報を表示することです。

GetType(Person)をオンにするswitchステートメントを使用してコードビハインドでコントロールを作成することを考えましたが、これについて私が気に入らないのは、ロジックがUserControlにあることです。オブジェクトが独自の表示をカプセル化するソリューションが欲しいので、新しいタイプのPersonを追加する場合、UserControlに戻って、新しいタイプのケースなどを追加する必要はありません。

4

1 に答える 1

0

男性/女性の分割を例にVisibiltyとると、パラメーターを受け取るコンバーターを介して、表示されているオブジェクトに要素をバインドする必要があります。

<TextBlock Visibility="{Binding SelectedPerson,
                        Converter={StaticResource GenderConverter},
                        ConverterParameter=Male)" />

次に、コンバーターで:

public class GenderConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((value is Man && parameter == "Male") ||
             value is Woman && parameter == "Female"))
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw NotImplementedException();
    }
}

つまり、クラスに任意のUIプロパティを追加して、希望どおりに表示させる必要はありません。

オブジェクトタイプのテストが100%わからない(このマシンにSilverlight 5がインストールされていない)

IValueConverterインターフェイスの詳細については、MSDNを参照してください。

于 2012-09-13T21:18:24.367 に答える