Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DependencyProperty的子属性上的样式触发器_C#_.net_Wpf_Xaml - Fatal编程技术网

C# DependencyProperty的子属性上的样式触发器

C# DependencyProperty的子属性上的样式触发器,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我有一个控件,我想根据该控件的自定义Message类型dependencProperty的设置设置该控件的样式 自定义类型: public class Message : ObservableObject { public MessageTypes MessageType { get { return _messageType; } set { RaisePropertyChanged(() => MessageTyp

我有一个控件,我想根据该控件的自定义
Message
类型
dependencProperty
的设置设置该控件的样式

自定义类型:

public class Message : ObservableObject
{
    public MessageTypes MessageType
    {
        get { return _messageType; }
        set {
            RaisePropertyChanged(() => MessageType);
            _messageType = value;
        } 
    }

    public string Text { ... }

    ...
}
public class MessageControl : Control
{
    public static readonly DependencyProperty MessageProperty =
        DependencyProperty.Register(
            "Message",
            typeof(Message),
            typeof(MessageControl),
            new FrameworkPropertyMetadata(null,
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public Message Message
    {
        get
        {
            return (Message)GetValue(MessageProperty);
        }
        set
        {
            SetValue(MessageProperty, value);
        }
    }
}
<ControlTemplate x:Key="MessageControlTemplate"
                 TargetType="controls:MessageControl">
    <Border Background="{TemplateBinding Background}">
        <TextBlock Text="{Binding Path=Message.Text,
                             RelativeSource={RelativeSource TemplatedParent}}" />
    </Border>
</ControlTemplate>

<Style TargetType="controls:MessageControl">
    <Setter Property="Template"
            Value="{StaticResource MessageControlTemplate}" />

    <Style.Triggers>
        <!-- HERE IS THE ISSUE -->
        <Trigger Property="Message.MessageType"
                 Value="{x:Static classes:MessageType.Error}">
            <Setter Property="Background" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>
控制:

public class Message : ObservableObject
{
    public MessageTypes MessageType
    {
        get { return _messageType; }
        set {
            RaisePropertyChanged(() => MessageType);
            _messageType = value;
        } 
    }

    public string Text { ... }

    ...
}
public class MessageControl : Control
{
    public static readonly DependencyProperty MessageProperty =
        DependencyProperty.Register(
            "Message",
            typeof(Message),
            typeof(MessageControl),
            new FrameworkPropertyMetadata(null,
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public Message Message
    {
        get
        {
            return (Message)GetValue(MessageProperty);
        }
        set
        {
            SetValue(MessageProperty, value);
        }
    }
}
<ControlTemplate x:Key="MessageControlTemplate"
                 TargetType="controls:MessageControl">
    <Border Background="{TemplateBinding Background}">
        <TextBlock Text="{Binding Path=Message.Text,
                             RelativeSource={RelativeSource TemplatedParent}}" />
    </Border>
</ControlTemplate>

<Style TargetType="controls:MessageControl">
    <Setter Property="Template"
            Value="{StaticResource MessageControlTemplate}" />

    <Style.Triggers>
        <!-- HERE IS THE ISSUE -->
        <Trigger Property="Message.MessageType"
                 Value="{x:Static classes:MessageType.Error}">
            <Setter Property="Background" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>
风格:

public class Message : ObservableObject
{
    public MessageTypes MessageType
    {
        get { return _messageType; }
        set {
            RaisePropertyChanged(() => MessageType);
            _messageType = value;
        } 
    }

    public string Text { ... }

    ...
}
public class MessageControl : Control
{
    public static readonly DependencyProperty MessageProperty =
        DependencyProperty.Register(
            "Message",
            typeof(Message),
            typeof(MessageControl),
            new FrameworkPropertyMetadata(null,
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public Message Message
    {
        get
        {
            return (Message)GetValue(MessageProperty);
        }
        set
        {
            SetValue(MessageProperty, value);
        }
    }
}
<ControlTemplate x:Key="MessageControlTemplate"
                 TargetType="controls:MessageControl">
    <Border Background="{TemplateBinding Background}">
        <TextBlock Text="{Binding Path=Message.Text,
                             RelativeSource={RelativeSource TemplatedParent}}" />
    </Border>
</ControlTemplate>

<Style TargetType="controls:MessageControl">
    <Setter Property="Template"
            Value="{StaticResource MessageControlTemplate}" />

    <Style.Triggers>
        <!-- HERE IS THE ISSUE -->
        <Trigger Property="Message.MessageType"
                 Value="{x:Static classes:MessageType.Error}">
            <Setter Property="Background" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

所以问题是我不能为
Message.MessageType
(或者基本上任何其他子属性)添加触发器


甚至有可能做到这一点吗?或者我应该在
MessageControl
中为
Text
MessageType
创建两个属性吗?

您可以使用DataTrigger执行此操作:

<Style TargetType="controls:MessageControl">
    ...
    <Style.Triggers>
        <DataTrigger Binding="{Binding Message.MessageType,
                               RelativeSource={RelativeSource Self}}"
                     Value="{x:Static classes:MessageType.Error}">
            <Setter Property="Background" Value="Red" />
        </DataTrigger>
    </Style.Triggers>
</Style>

谢谢你,真管用!关于PropertyChanged这件事,我只是想把它写出来,因为真正的代码有点复杂,但通常你对顺序的看法是正确的。