Как привязать пользовательское свойство в пользовательском элементе управления Silverlight - PullRequest
1 голос
/ 23 июля 2010

Я создал пользовательский элемент управления, среди прочего, со следующим:

public partial class MyButton : UserControl
{
  public bool Enabled
  {
    get { return (bool)GetValue(EnabledProperty); }
    set { 
      SetValue(EnabledProperty, value); 
      SomeOtherStuff();
      }
    }
  }

  public static readonly DependencyProperty EnabledProperty =
     DependencyProperty.Register("Enabled", typeof(bool), typeof(MyButton), new PropertyMetadata(true));

  public static void SetEnabled(DependencyObject obj, bool value)
  {
    obj.SetValue(EnabledProperty, value);
  }
  public static bool GetEnabled(DependencyObject obj)
  {
    return (bool) obj.GetValue(EnabledProperty);
  }
}

В моем XAML я (пытаюсь) использовать привязку, чтобы установить свойство Enabled:

<MyButton x:Name="myButtom1" Enabled="{Binding CanEnableButton}"/>

Я знаю, что привязка между моим элементом управления и базовой моделью данных действительна и работает, так как я могу связать IsEnabled (собственное свойство базового UserControl), и она работает, как и ожидалось. Однако мое свойство Enabled никогда не устанавливается через вышеуказанную привязку. Я установил контрольные точки на моем наборе / получении свойств, и они никогда не были затронуты.

Я могу только представлять, что пропустил что-то, связанное с привязкой в ​​моем пользовательском элементе управления. Кто-нибудь может увидеть что?

Я пытался реализовать INotifyPropertyChanged на моем элементе управления (и вызывал событие PropertyChanged из моего включенного установщика) ... но это не помогло.

[Кстати: если вам интересно «Почему?»: Я не могу перехватить изменения в состоянии IsEnabled базового элемента управления, поэтому я решил реализовать и использовать собственную версию свойства Enable / disable (которую я называется Включено) - тот, где я мог бы подключить свой собственный код в установщик свойств]

Ответы [ 2 ]

3 голосов
/ 23 июля 2010

Прежде всего удалите пару SetEnabled и GetEnabled, это имеет смысл только для присоединенного свойства, которое не то, что вы делаете.

Теперь ваша главная проблема в том, что вы находитесь под ложнымПредположение, что члены get / set вашей собственности вызываются во время связывания, а не они.

Вам нужно передать метод обратного вызова в метаданные свойства, именно здесь вы перехватываете изменения и принимаетедругие действия, такие как: -

    public bool IsEnabled
    {
        get { return (bool)GetValue(IsEnabledProperty); }
        set { SetValue(IsEnabledProperty, value); }
    }

    public static readonly DependencyProperty IsEnabledProperty =
        DependencyProperty.Register(
            "IsEnabled",
            typeof(bool),
            typeof(MyButton),
            new PropertyMetadata(true, OnIsEnabledPropertyChanged));

    private static void OnIsEnabledPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MyButton source = d as MyButton;
        source.SomeOtherStuff();

    }

    private void SomeOtherStuff()
    {
         // Your other stuff here
    }

С этим независимо от того, как изменяется свойство, процедура SomeOtherStuff будет выполняться.

2 голосов
/ 26 июля 2010

Я бы предложил использовать событие IsEnabledChanged , которое является частью каждого элемента Control / UserControl.

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

public MainPage()
{
    InitializeComponent();

    this.IsEnabledChanged += new DependencyPropertyChangedEventHandler(MainPage_IsEnabledChanged);
}

void MainPage_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    // Do SomeStuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...