Привязка не обновляет свойство - PullRequest
0 голосов
/ 31 августа 2010

У меня есть 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

DataType свойство в DataDependentControl определяется следующим образом:

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);

В целом:

Внутри <StackPanel/>:

Если выбран тип данных «строка», должен быть виден

<TextBox x:Name="TextBoxControl"/>

Если выбран тип данныхв «DateTime» должно быть видимым

<Controls:Calendar/>

Если выбранный тип данных «Boolean», то должно быть видимым

<ComboBox/>

DataDependentControl имеет свойство «DataType», которое определено в выпадающем списке.DataType связан с данными:

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

1 Ответ

0 голосов
/ 31 августа 2010

Похоже, вы пытаетесь настроить свойства зависимостей на 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...