2012-07-19 85 views
1

我有一些簡單的依賴屬性不工作。我查看過他們,查看了我過去使用的代碼,但我不確定他們爲什麼不工作。DependencyProperty不工作在自定義UserControl

我有一個自定義的基類(MyBaseControl),它擴展了UserControl,然後我的自定義UI控件就擴展了它。例如,MyCustomControl擴展了MyBaseControl。

MyCustomControl XAML很簡單:

<StackPanel> 
    <Image Source="{Binding Icon}" /> 
    <TextBlock Text="{Binding Blurb}" /> 
</StackPanel> 

MyCustomControl代碼如下所示:

public partial class MyCustomControl: MyBaseControl 
{ 
    //public static readonly DependencyProperty IconProperty = Image.SourceProperty.AddOwner(typeof(MyCustomControl)); 
    //public static readonly DependencyProperty BlurbProperty = TextBlock.TextProperty.AddOwner(typeof(MyCustomControl)); 

    public static readonly DependencyProperty IconProperty = 
     DependencyProperty.Register(
     "Icon", 
     typeof(ImageSource), 
     typeof(MyCustomControl), 
     new PropertyMetadata(null)); 

    public static readonly DependencyProperty BlurbProperty = 
     DependencyProperty.Register(
     "Blurb", 
     typeof(String), 
     typeof(MyCustomControl), 
     new PropertyMetadata(null)); 

    public MyCustomControl() : base() 
    { 
     InitializeComponent(); 
    } 

    #region Properties 

    public ImageSource Icon 
    { 
     get { return (ImageSource)GetValue(IconProperty); } 
     set { SetValue(IconProperty, value); } 
    } 

    public String Blurb 
    { 
     get { return (String)GetValue(BlurbProperty); } 
     set { SetValue(BlurbProperty, value); } 
    } 

    #endregion Properties 
} 

請注意,我已經嘗試了幾種不同的方式來定義DependencyProperty。兩者都不起作用。

我打電話給我以下列方式控制:

<ctrl:MyCustomControl Height="240" VerticalAlignment="Center" HorizontalAlignment="Center" Width="320" Blurb="Slide Show" Icon="pack://application:,,,/Resources/photo_scenery.png" /> 

如果我直接在XAML設置源或文本,它們顯示了就好了。綁定只是不想正常工作。

我錯過了什麼,不允許我的綁定通過?

謝謝你的幫助!

更新:我更新了基於評論和我試過的其他更改的代碼。

回答

4

您正在註冊Icon屬性有誤。在它的註冊方法,你需要指定,即代替「IconProperty」的DP的名稱應該是「Icon」 -

public static readonly DependencyProperty IconProperty = 
     DependencyProperty.Register(
     "Icon", 
     typeof(ImageSource), 
     typeof(MyCustomControl), 
     new PropertyMetadata(null)); 

另外,嘗試像這樣在您的綁定設置的RelativeSource -

<StackPanel> 
    <Image Source="{Binding Icon, RelativeSource={RelativeSource 
      Mode=FindAncestor, AncestorType={x:Type ctrl:MyCustomControl}}}" /> 
    <TextBlock Text="{Binding Blurb, RelativeSource={RelativeSource 
      Mode=FindAncestor, AncestorType={x:Type ctrl:MyCustomControl}}}" /> 
</StackPanel> 
+1

謝謝RV1987。我準備在空中搖擺我的拳頭,因爲我的代碼看起來至少有兩個問題。我做了上述改變,但仍然沒有看到我的形象。 – 2012-07-19 18:17:37

+0

我已經更新了答案。您需要爲您的綁定指定relativeSource。 – 2012-07-19 18:24:00

+0

綁定上的RelativeSource做到了。謝謝!我將需要重新閱讀所有這些內容 - 因爲我不瞭解他們的需求,但現在它仍然有效!再次感謝! – 2012-07-19 18:27:46

0

或者,您可以不按照Rohit Vats的建議設置RelativeSource,而可以通過更新代碼來解決問題,如下所示:

<StackPanel> 
    <Image Name="imgImage" Source="{Binding Icon}" /> 
    <TextBlock Name="txtTextBlock" Text="{Binding Blurb}" /> 
</StackPanel> 

public LabeledTextBox() 
{ 
    InitializeComponent(); 
    imgImage.DataContext = this; 
    txtTextBlock.DataContext = this; 
} 
相關問題