Setter但不适用于WPF中的Style?

时间:2011-04-27 18:22:21

标签: wpf xaml

我知道触发器与Setter如何在WPF中工作,我知道Setters只能更改样式属性。对于非样式属性,是否有类似于Setter的东西?我真的希望能够更改在XAML中实例化的自定义对象的属性。有什么想法吗?

编辑:虽然Setters可以更新任何依赖项属性,但我试图在EventTrigger中执行此操作,我忘了指定。有this解决方法,但我不确定这是否是最佳做法。它使用故事板和ObjectAnimationUsingKeyFrames。这有什么不对吗?

2 个答案:

答案 0 :(得分:1)

使用Blend SDK中的Interactivity您可以在XAML中执行此操作,您只需创建一个设置属性的TriggerAction


修改:其他命名空间中已存在此类操作:ChangePropertyAction

在XAML中,您可以使用此命名空间:http://schemas.microsoft.com/expression/2010/interactions


经过测试的例子:

public class PropertySetterAction : TriggerAction<Button>
{
    public object Target { get; set; }
    public string Property { get; set; }
    public object Value { get; set; }

    protected override void Invoke(object parameter)
    {
        Type type = Target.GetType();
        var propertyInfo = type.GetProperty(Property);
        propertyInfo.SetValue(Target, Value, null);
    }
}
<StackPanel>
    <StackPanel.Resources>
        <obj:Employee x:Key="myEmp" Name="Steve" Occupation="Programmer"/>
    </StackPanel.Resources>
    <TextBlock>
        <Run Text="{Binding Source={StaticResource myEmp}, Path=Name}"/>
        <Run Name="RunChan" Text=" - "/>
        <Run Text="{Binding Source={StaticResource myEmp}, Path=Occupation}"/>
    </TextBlock>
    <Button Content="Demote">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <t:PropertySetterAction Target="{StaticResource myEmp}"
                                        Property="Occupation"
                                        Value="Coffee Getter"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
</StackPanel>

请注意,如果Value是对象,则默认值不会发生。如果您输入值作为属性(Value="Something"),它将被解释为字符串。例如,要设置int,您可以执行以下操作:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
<t:PropertySetterAction Target="{StaticResource myEmp}"
                        Property="Id">
    <t:PropertySetterAction.Value>
        <sys:Int32>42</sys:Int32>
    </t:PropertySetterAction.Value>
</t:PropertySetterAction>

答案 1 :(得分:0)

您是否已声明要设置为依赖项属性的属性?我找不到我这样做的项目,但我很确定这是为我修复它的原因。

我尝试实现非常简单的东西,并得到以下内容: 属性“Type”不是DependancyProperty。要在标记中使用,必须在目标类型上公开非附加属性,并使用可访问的实例属性“类型”。对于附加属性,声明类型必须提供静态“GetType”和“SetType”方法。

以下是我的另一个项目的依赖属性注册示例:

 Public Shared TitleProperty As DependencyProperty = DependencyProperty.Register("Title", GetType(String), GetType(SnazzyShippingNavigationButton))

在上面的示例中,SnazzyShippingNavigationButton是属性所属的类名。

以及相关的财产声明:

<Description("Title to display"), _
 Category("Custom")> _
Public Property Title() As String
    Get
        Return CType(GetValue(TitleProperty), String)
    End Get
    Set(ByVal value As String)
        SetValue(TitleProperty, value)
    End Set
End Property

描述和类别属性仅适用于IDE设计器属性网格显示。