Обновление пользовательского вложенного свойства в Style Trigger с помощью Setter - PullRequest
12 голосов
/ 10 апреля 2009

Я пробовал прикрепленные свойства и триггеры стиля, надеясь узнать больше об этом. Я написал очень простое приложение Windows WPF с прикрепленным свойством:

  public static readonly DependencyProperty SomethingProperty = 
      DependencyProperty.RegisterAttached(
          "Something", 
          typeof(int), 
          typeof(Window1),
          new UIPropertyMetadata(0));

  public int GetSomethingProperty(DependencyObject d)
  {
      return (int)d.GetValue(SomethingProperty);
  }
  public void SetSomethingProperty(DependencyObject d, int value)
  {
      d.SetValue(SomethingProperty, value);
  }

И я пытался обновить присоединенное свойство 'Something' с помощью триггера свойства, определенного в разделе стиля кнопки:

  <Window x:Class="TestStyleTrigger.Window1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="clr-namespace:TestStyleTrigger;assembly=TestStyleTrigger"
      Title="Window1" Height="210" Width="190">
      <Window.Resources>
          <Style x:Key="buttonStyle" TargetType="{x:Type Button}">
              <Style.Triggers>
                  <Trigger Property="IsPressed" Value="True">
                      <Setter Property="local:Window1.Something" Value="1" />
                  </Trigger>
              </Style.Triggers>
          </Style>
      </Window.Resources>

      <Button Style="{StaticResource buttonStyle}"></Button>
  </Window>

Однако я продолжал получать следующую ошибку компиляции:

ошибка MC4003: не удается разрешить свойство стиля «Что-то». Убедитесь, что владельцем является тип TargetType стиля, или используйте синтаксис Class.Property для указания свойства. Строка 10, позиция 29.

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

1 Ответ

17 голосов
/ 10 апреля 2009

Ваши методы поддержки для свойства зависимости названы неправильно и должны быть статическими:

public static int GetSomething(DependencyObject d)
{
    return (int)d.GetValue(SomethingProperty);
}

public static void SetSomething(DependencyObject d, int value)
{
    d.SetValue(SomethingProperty, value);
}

Кроме того, вы не должны указывать сборку в локальном сопоставлении NS NS в XAML, поскольку пространство имен находится в текущей сборке. Сделайте это вместо:

xmlns:local="clr-namespace:TestStyleTrigger"
...