0

我在 Silverlight 中有一个自定义的 UserControl,它很简单,由 TextBlocks 和 TextBoxes 组成。我有一个类实体的层次结构如下:

  • Person 是一个抽象超类,包含属性 Name 和 Age
  • Man 是 Person 的子对象,添加了 FacialFeature 属性
  • Woman 是 Person 添加属性 LastMenstruated 和 HasHymen 的孩子

所以:

  • 一个人包含属性名称和年龄
  • 一个 Man 包含属性 Name、Age 和 FacialFeature
  • 一个女人包含属性名称、年龄、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 回答