Сеттер, но не для стиля в WPF? - PullRequest
0 голосов
/ 27 апреля 2011

Я знаю, как триггеры с сеттерами работают в WPF, и я знаю, что сеттеры могут изменять только свойства стиля. Есть ли что-то эквивалентное Setter для свойств, не относящихся к стилю? Я действительно хочу иметь возможность изменить свойство пользовательского объекта, который создается в XAML. Есть идеи?

Редактировать: Хотя сеттеры могут обновлять любое свойство зависимости, я пытаюсь сделать это в EventTrigger, который я забыл указать. Существует этот обходной путь, но я не уверен, что это действительно лучшая практика. Он использует раскадровки и ObjectAnimationUsingKeyFrames. Что-то не так с этим?

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Используя Interactivity из Blend SDK , вы можете сделать это в 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 является объектом по умолчанию, ValueConversion не будет иметь место, если вы введете значение в качестве атрибута (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>
0 голосов
/ 27 апреля 2011

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

Я попытался реализовать что-то довольно простое, и получил следующее: Свойство "Тип" неa 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

Атрибуты Description и Category действительно применяются только к отображению сетки свойств конструктора IDE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...