Значение по умолчанию для свойства зависимости не переопределяется - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь переопределить значение свойства зависимости, но оно, похоже, не работает.

В моем коде Xaml у меня есть кнопка со следующим CommandParameter:

CommandParameter="{Binding State,Mode=OneWay}

и здесь я объявляю свое свойство зависимости:

public class MyStateControl : UserControl
{
  public MyStateControl()
  {
      this.InitializeComponent();
  }

  public string State
  {
    get { return (string)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); } 
  }
  public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(string), typeof(MyStateControl),new   PropertyMetadata("DEFAULT"));
}

, а затем здесь я пытаюсь получить это значение, чтобы использовать его после переопределения.Когда я нажимаю кнопку, вызывается onMyCommandExecuted.и значение obj равно "DEFAULT"

public class MyAdvancedStateControl : INotifyPropertyChanged
{

  public MyAdvancedStateControl()
  {
   MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata("Successfully overriden"));
  }

  private void onMyCommandExecuted(object obj)
  {
    //TODO
  }
}

Я что-то не так делаю?Если так, каков наилучший способ переопределить значение свойства зависимости?И было бы возможно / вероятно лучше установить значение по умолчанию как переменную, которую я могу затем легко изменить с MyAdvancedStateControl?Спасибо

1 Ответ

0 голосов
/ 05 марта 2019

Создайте конструктор из MyAdvancedStateControl static.

Метаданные свойства зависимости должны быть переопределены, прежде чем система свойств будет использовать свойство зависимости.Это соответствует времени, когда конкретные экземпляры создаются с использованием класса, который регистрирует свойство зависимости. Вызовы OverrideMetadata должны выполняться только внутри статических конструкторов типа, который предоставляет себя в качестве параметра forType этого метода, или с помощью аналогичной реализации.Попытка изменить метаданные после существования экземпляров типа владельца не вызовет исключений, но приведет к несогласованному поведению в системе свойств.

From DependencyProperty.OverrideMetadata

public static MyAdvancedStateControl()
{
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyStateControl), new PropertyMetadata("Successfully overriden"));
}
...