【问题标题】:Binding doesn't update the property绑定不更新属性
【发布时间】:2010-08-31 08:43:56
【问题描述】:

我有定义依赖属性的 DataDependentControl: TextVisibility、CalendarVisibility、ComboControlVisibility。 当我在具有枚举数据类型的外部组合框中选择一些值时,上述属性会更新为 Visibility 枚举值,但绑定不会更新内部控件上的 Visibility 属性:

        <Views:DataDependentControl x:Name="typeValue">
            <StackPanel x:Name="container">
                <TextBox x:Name="TextBoxControl" Visibility="{Binding ElementName=typeValue, Path=TextVisibility, Mode=OneWay}"/>
                <Controls:Calendar x:Name="CalendarControl" HorizontalAlignment="Left" Visibility="{Binding ElementName=typeValue, Path=CalendarVisibility}"/>
                <ComboBox x:Name="ComboBoxControl" Visibility="{Binding ElementName=typeValue, Path=ComboControlVisibility}"/>
            </StackPanel>
        </Views:DataDependentControl>

DataDependentControl 具有 DataType 属性。 根据 DataType 我通过以下属性隐藏或折叠子控件: ComboControlVisibility、CalendarVisibility 或 TextVisibility

DataDependentControl 中的

DataType 属性定义如下:

public static readonly DependencyProperty DataTypeProperty = DependencyProperty.Register(
            DataTypePropertyName,
            typeof (DataTypeEnum),
            typeof (DataDependentControl),
            new PropertyMetadata(ValueChangedCallback));

ValueChangedCallback函数定义如下:

private static void ValueChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var thisObject = (DataDependentControl)d;
            var newValue = (DataTypeEnum) e.NewValue;

            switch (newValue)
            {
                case DataTypeEnum.Bool:
                    thisObject.ComboControlVisibility = Visibility.Visible;
                    thisObject.CalendarVisibility = Visibility.Collapsed;
                    thisObject.TextVisibility = Visibility.Collapsed;

....

TextVisibility、CalendarVisibility 或 ComboControlVisibility 的示例在这里:

public static readonly DependencyProperty TextVisibilityProperty = DependencyProperty.Register(
            TextVisibilityPropertyName,
            typeof (Visibility),
            typeof (DataDependentControl),
            null);

总而言之:

&lt;StackPanel/&gt;里面:

如果选择的数据类型是“字符串”,那么应该是可见的

<TextBox x:Name="TextBoxControl"/>

如果选择的数据类型是“DateTime”,应该是可见的

<Controls:Calendar/>

如果选择的数据类型是“布尔”,那么应该是可见的

<ComboBox/>

DataDependentControl 具有在组合框中定义的“DataType”属性。 “DataType”是数据绑定的:

<Views:DataDependentControl x:Name="typeValue"
                                        DataType="{Binding SelectedItem, ElementName=DataTypes, Converter={StaticResource DataTypeReverseConverter}}"

【问题讨论】:

  • 您能否也提供您的代码隐藏(带有依赖属性)?谢谢。
  • 我更新了信息。谢谢。
  • 描述有错误:“typeValue”不是组合框,而是定义了DataType属性的普通用户控件和子控件可见性根据DataType更新

标签: silverlight data-binding


【解决方案1】:

在我看来,您正在尝试使用 ComboBox 上的依赖属性,即使它们是由您的 DataDependentControl 定义的。如果子控件的可见性与ComboBox 的可见性相关联,为什么不这样做呢?

<Views:DataDependentControl x:Name="typeValue">
    <StackPanel x:Name="container">
        <TextBox x:Name="TextBoxControl" Visibility="{Binding Visibility, ElementName=typeValue}"/>
        <Controls:Calendar x:Name="CalendarControl" HorizontalAlignment="Left"  Visibility="{Binding Visibility, ElementName=typeValue}"/>
        <ComboBox x:Name="ComboBoxControl"  Visibility="{Binding Visibility, ElementName=typeValue}"/>
    </StackPanel>
</Views:DataDependentControl>

或者,甚至更好:

<Views:DataDependentControl x:Name="typeValue">
    <StackPanel x:Name="container" Visibility="{Binding Visibility, ElementName=typeValue}">
        <TextBox x:Name="TextBoxControl"/>
        <Controls:Calendar x:Name="CalendarControl" HorizontalAlignment="Left"/>
        <ComboBox x:Name="ComboBoxControl"/>
    </StackPanel>
</Views:DataDependentControl>

【讨论】:

  • 我在“All in all”之后添加了信息 可见性是有选择性的。并非所有控件都应该可见或折叠
  • 顺便说一句,如果为 DataDependentControl 中的每个子控件开发 IValuConvertor 并将数据绑定到外部组合框值的可见性,您的方式会很好。
  • 描述有错误:“typeValue”不是组合框,而是定义了DataType属性和子控件的普通用户控件Visibility属性根据DataType更新
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2019-03-24
  • 2012-07-18
  • 2021-09-01
相关资源
最近更新 更多