2010-07-23 27 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中,我(嘗試)使用時綁定設置Enabled屬性:

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

我知道我的控制和基礎數據模型之間的結合是有效的和工作,我可以綁定「的IsEnabled」(潛在用戶控件的原生屬性),它按預期工作。但是,我的Enabled屬性從來沒有通過上面的綁定來設置。我在我的財產設置/獲得了斷點,他們從來沒有受到打擊。

我只能成像我錯過了與我的自定義控件中的綁定相關的內容。任何人都能看到什麼?

我試着在我的控件上實現INotifyPropertyChanged(並從我啓用的setter中調用PropertyChanged事件)......但那並沒有解決它。我不能攔截基本控件的IsEnabled狀態的變化,所以我決定實現並使用我自己版本的啓用/禁用屬性(它我打電話給Enabled) - 一個我可以將自己的代碼插入屬性設置器的地方]

回答

3

首先放下SetEnabledGetEnabled對,這些只對您所做的不屬於附加屬性有意義。

現在你的主要問題是你在假設你的propery的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 2010-07-25 21:34:16

+0

謝謝。這對知道有用。正如下面所指出的那樣,利用現有的Enabled changed事件是我應該(而且將會)正在做的事情。然而,我的成像我需要在某個時候在控件上創建一個可綁定的屬性,並且當時的建議將非常寶貴。 – Trevor 2010-07-26 07:15:47

2

我建議使用作爲每個Control/UserControl的一部分的IsEnabledChanged事件。

這將允許您連接到事件並執行您想要採取的任何操作。

public MainPage() 
{ 
    InitializeComponent(); 

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

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

這確實是更好的解決方案,我會採用的解決方案 - 謝謝。然而,我將安東尼的答覆標記爲'答案',因爲它提供了實現可綁定財產所需的相關信息。 – Trevor 2010-07-26 07:17:45

相關問題