как определить триггеры в стиле в пользовательском управлении - PullRequest
5 голосов
/ 04 июля 2011

У меня есть пользовательский элемент управления, и в нем у меня есть несколько элементов управления textbox / calendar / ..., которые все они должны быть включены или отключены на основе свойства в моем пользовательском элементе управления (IsEditing)

Я создал свойство зависимости IsEditing в своем пользовательском элементе управления, и теперь я хочу определить стиль, чтобы все элементы управления использовали его для включения или отключения.

Я пытаюсь сделать что-то вроде этого:

<ad:DocumentContent.Resources>
    <Style x:Key="ReadOnlyMode">
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="Visibility" Value="Visible"/>
        <Setter Property="IsEnabled" Value="False" />
        <Style.Triggers>
            <Trigger Property="IsEditing" Value="True">
                <Setter Property="Background" Value="Green"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ad:DocumentContent.Resources>

Но я получаю эту ошибку: свойство 'IsEditing' не найдено в типе 'FrameworkElement'.

Как мне указать правильное свойство для триггеров?


Обновление 1:

Я определил IsEditing следующим образом:

public static readonly DependencyProperty IsEditingProperty = DependencyProperty.Register(
            "IsEditing", typeof(Boolean), typeof(MyDetailDataControl), new PropertyMetadata(false));

И определены следующие стили:

<ad:DocumentContent.Resources>
    <Style x:Key="ReadOnlyMode" xmlns:u="clr-namespace:MyProject.Controls" TargetType="{x:Type u:MyDetailDataControl}">
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="Visibility" Value="Visible"/>
        <Setter Property="IsEnabled" Value="False" />
        <Style.Triggers>
            <Trigger Property="IsEditing" Value="True">
                <Setter Property="Background" Value="Green"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ad:DocumentContent.Resources>

Но сейчас я получаю следующую ошибку: Свойство 'IsEditing' не найдено в типе 'MyDetailDataControl'.

Я думаю, что есть проблема с определением свойства зависимости.


Обновление 2:

Я изменил xaml следующим образом (добавьте xmlns: l = "clr-namespace: MyProject.Controls" в разделе управления пользователем, чтобы пространство имен стало доступно везде), а также использовал метод, который определен здесь http://www.wpfmentor.com/2009/01/how-to-debug-triggers-using-trigger.html для отладки триггера)

<ad:DocumentContent.Resources>
    <Style x:Key="ReadOnlyMode" TargetType="TextBox">
        <Style.Triggers>
            <Trigger my:TriggerTracing.TriggerName="BoldWhenMouseIsOver" my:TriggerTracing.TraceEnabled="True" Property="l:MyDetailDataControl.IsEditing" Value="True">
                 <Setter Property="TextBox.Background" Value="Green"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ad:DocumentContent.Resources>

Но триггер не сработал? Нужно ли вам реализовать механизм уведомления свойства? если да, как я могу это сделать? Существует ли какая-либо специальная техника для реализации уведомления об изменении свойства, когда свойство является присоединенным свойством?


Обновление 3: Изменено на эту версию, которая не связана с моим собственным свойством IsEditing. Но все равно не работает.

<ad:DocumentContent.Resources>
    <Style x:Key="MyStyle" TargetType="{x:Type l:MyDetailDataControl}" >
        <Style.Triggers>
            <Trigger my:TriggerTracing.TriggerName="BoldWhenMouseIsOver" my:TriggerTracing.TraceEnabled="True" Property="IsMouseOver" Value="True">
                <Setter Property="FontWeight" Value="Bold"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ad:DocumentContent.Resources>

1 Ответ

5 голосов
/ 04 июля 2011

Вам необходимо установить TargetType стиля в соответствии с типом вашего UserControl. Или префикс всех свойств с ним.

<!-- Using TargetType -->
<Style xmlns:u="clr-namespace:Test.UserControls"
       x:Key="ReadOnlyMode"
       TargetType="{x:Type u:MyUserControl1}">
    <Style.Triggers>
        <Trigger Property="IsEditing" Value="True">
            <!-- ... -->
        </Trigger>
    </Style.Triggers>
</Style>
<!-- Using qualified property -->
<Style xmlns:u="clr-namespace:Test.UserControls"
       x:Key="ReadOnlyMode">
    <Style.Triggers>
        <Trigger Property="u:MyUserControl1.IsEditing" Value="True">
            <!-- ... -->
        </Trigger>
    </Style.Triggers>
</Style>

Относительно вашей другой проблемы: для объекта требуется CLR-Wrapper:

public static readonly DependencyProperty IsEditingProperty =
        DependencyProperty.Register("IsEditing", typeof(Boolean), typeof(MyDetailDataControl), new UIPropertyMetadata(false));
// This:
public Boolean IsEditing
{
    get { return (Boolean)GetValue(IsEditingProperty); }
    set { SetValue(IsEditingProperty, value); }
}
...