Ссылка на перечисление, определенное в классе из XAML - PullRequest
2 голосов
/ 11 октября 2010

В Expression Blend 4 (проект Silverlight) у меня есть UserControl, к которому я добавил свойство CLR. Это свойство является типом enum, который определен в UC. Я прикрепил поведение ChangePropertyAction к экземпляру UC. Однако синтаксический анализатор XAML выдает следующую ошибку (среди прочих):

'+' недопустимо в имени

Это потому, что был сгенерирован следующий XAML (фрагмент):

<local:SomeControl Margin="155,113,317,0" d:LayoutOverrides="Width, Height">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseLeftButtonDown">
      <ei:ChangePropertyAction PropertyName="MyProp">
        <ei:ChangePropertyAction.Value>
          <local:SomeControl+MyEnum>Second</local:SomeControl+MyEnum> <----- Error on this line caused by the '+' 
        </ei:ChangePropertyAction.Value>
      </ei:ChangePropertyAction>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</local:SomeControl>

Код позади:

public partial class SomeControl : UserControl
{
    public SomeControl()
    {
        // Required to initialize variables
        InitializeComponent();
    }

    public MyEnum MyProp
    {
        get; set;
    }

    public enum MyEnum
    {
        First,
        Second,
        Third
    }
}

Простой обходной путь состоит в том, чтобы "продвигать" перечисление из класса (например, SomeControl_MyEnum), но есть ли более чистое решение?

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Использование имени вложенного типа в Xaml не поддерживается. Вы все еще можете указать значение свойства без ссылки на имя типа. Любое из следующего должно работать:

<local:SomeControl Margin="155,113,317,0" d:LayoutOverrides="Width, Height">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseLeftButtonDown">
      <ei:ChangePropertyAction PropertyName="MyProp">
        <ei:ChangePropertyAction.Value>Second</ei:ChangePropertyAction.Value>
      </ei:ChangePropertyAction>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</local:SomeControl>

или

<local:SomeControl Margin="155,113,317,0" d:LayoutOverrides="Width, Height">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseLeftButtonDown">
      <ei:ChangePropertyAction PropertyName="MyProp" Value="Second" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</local:SomeControl>

Если для вас важно иметь возможность ссылаться на тип MyEnum из Xaml, вам нужно переместить определение из класса SomeControl.

1 голос
/ 11 октября 2010

Вам необходимо использовать расширение разметки x: Static , не забудьте при необходимости добавить пространство имен в XAML.

Пример будет:

"{x:Static Member=MyProject:MyEnum.First}"

Если вы хотите внести в уравнение связывание, прочитайте this

...