2010-07-23 2 views
1

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

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, я (стараюсь) использовать связывание для установки Включено свойство:

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

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

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

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

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

ответ

3

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

Теперь ваша главная проблема заключается в том, что вы находитесь под ложным предположением о том, что члены 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.

+0

Я думаю, что использование встроенного события IsEnabledChanged является лучшим выбором для реализации другого свойства «включено» в элементе управления. (См. Мой ответ). – WiredPrairie

+0

Спасибо. Это полезно знать. Как указано ниже, использование существующего события с включенным изменением - это то, что я должен (и будет) делать. Тем не менее, я получаю визуализацию, в какой-то момент мне нужно будет создать свойство bindable в элементе управления, и в то время вы будете неоценимы. – Trevor

2

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

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

public MainPage() 
{ 
    InitializeComponent(); 

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

void MainPage_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    // Do SomeStuff 
} 
+0

Это действительно лучшее решение, и тот, который я приму - спасибо. Тем не менее я заметил ответ Энтони как «ответ», поскольку он предоставляет соответствующую информацию, необходимую для реализации свойства bindable. – Trevor

Смежные вопросы