Использование настраиваемых свойств зависимостей в качестве DataTrigger в WPF

У меня есть пользовательское свойство зависимостей, которое я хотел бы использовать в качестве триггера данных. Вот код позади:

public static readonly DependencyProperty BioinsulatorScannedProperty =
    DependencyProperty.Register(
        "BioinsulatorScanned", 
        typeof(bool), 
        typeof(DisposablesDisplay), 
        new FrameworkPropertyMetadata(false));

    public bool BioinsulatorScanned
    {
        get
        {
            return (bool)GetValue(BioinsulatorScannedProperty);
        }
        set
        {
            SetValue(BioinsulatorScannedProperty, value);
        }
    }

Я создал стиль и шаблон управления. Моя цель - изменить цвет некоторого текста, когда для свойства зависимости установлено значение true...

<Style x:Key="TreatEye" TargetType="Label">
        <Setter Property="Foreground" Value="#d1d1d1" />
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="FontSize" Value="30" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Label">
                    <Canvas>                            
                        <TextBlock x:Name="bioinsulatorText" 
                                   Canvas.Left="21" Canvas.Top="33" 
                                   Text="Bioinsulator" />
                        <TextBlock Canvas.Left="21" Canvas.Top="70" 
                                   Text="KXL Kit" />
                    </Canvas>

                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding BioinsulatorScanned}"
                                     Value="True">
                            <Setter TargetName="bioinsulatorText" 
                                    Property="Foreground" Value="Black" />
                        </DataTrigger>
                    </ControlTemplate.Triggers>

                </ControlTemplate>
            </Setter.Value>
        </Setter>            
    </Style>

Несмотря на успешную программную установку свойства зависимости в значение true, это условие триггера никогда не срабатывает. Это настоящая боль для отладки!

Заранее спасибо.


person BabaBooey    schedule 04.01.2010    source источник
comment
Для какого объекта вы определили свойство зависимости?   -  person Aviad P.    schedule 05.01.2010
comment
Я не уверен, что правильно понял, но я пытаюсь использовать свойство зависимостей в разделе ControlTemplate.Triggers. Когда это правда, мне нужно, чтобы текст в bioinsulatorText стал черным.   -  person BabaBooey    schedule 05.01.2010


Ответы (2)


Похоже, ваше свойство зависимостей определено внутри созданного вами объекта DisposableDisplay. Чтобы указанная привязка работала, экземпляр этого объекта DisposableDisplay должен быть установлен как DataContext элемента управления (метка в данном случае) или любого из его предков.

person Aviad P.    schedule 04.01.2010
comment
Это работает отлично. Как новичок в WPF, я обнаружил, что привязка данных является одной из самых проблемных тем. В каких случаях не нужно устанавливать DataContext? - person BabaBooey; 05.01.2010
comment
DataContext устанавливается по умолчанию при использовании шаблонов данных. И шаблоны данных используются по умолчанию в элементах управления элементами (списки, представления списков, сетки данных и т. д.). Кроме того, вы можете явно задать контекст данных для любого элемента, чтобы упростить привязку. Это одна из самых важных концепций WPF. - person Aviad P.; 05.01.2010

В этом случае я переключаю видимость кнопки с помощью триггера данных на основе свойства зависимости FirstLevelProperty.

public static readonly DependencyProperty FirstLevelProperty = DependencyProperty.Register("FirstLevel", typeof(string), typeof(MyWindowClass));

public string FirstLevel
        {
            get
            {
                return this.GetValue(FirstLevelProperty).ToString();
            }

            set
            {
                this.SetValue(FirstLevelProperty, value);
            }
        }

Вы можете сослаться на свойство зависимостей FirstLevel(Property), содержащееся (в данном случае) в окне, используя привязку RelativeSource. Также вы должны установить настройку по умолчанию в стиле, которая будет переопределена триггером данных.

<Button.Style>
    <Style TargetType="Button">
        <Style.Triggers>
            <DataTrigger 
             Binding="{Binding Path=FirstLevel,
             RelativeSource={RelativeSource FindAncestor,
             AncestorType={x:Type Window}}}" 
             Value="SomeValue">
                <Setter Property="Visibility" 
                 Value="Hidden" />
             </DataTrigger>
        </Style.Triggers>
        <Setter Property="Visibility" Value="Visible" />
    </Style>
</Button.Style>
person mark carew    schedule 01.02.2012