【问题标题】:Different Control Behavior based on the type of the Binding in SilverlightSilverlight 中基于绑定类型的不同控件行为
【发布时间】:2012-09-13 21:09:30
【问题描述】:

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

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

所以:

  • Person 包含属性 Name 和 Age
  • a Man 包含属性 Name、Age 和 FacialFeature
  • a Woman 包含属性 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 并为新类型添加案例等。

【问题讨论】:

    标签: binding silverlight-5.0


    【解决方案1】:

    以你的男/女分割为例,你需要通过带参数的转换器将元素的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 interface 的更多信息可以在 MSDN 上找到。

    【讨论】:

    • 太好了,这正是我想要的。我改变了一点。我的转换器只是返回“Visibility.Visible”。并且绑定有一个“FallbackValue=Collapsed”。这样,如果我在 Person.FacialFeature 上绑定,如果绑定失败(因为人是女人)或绑定成功并通过转换器设置为可见,控件将被隐藏,因此显示控件。这样,我什至不需要转换器中的 if else 逻辑。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2013-02-22
    • 2011-05-20
    • 1970-01-01
    • 2020-07-29
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多