2010-04-12 32 views
1

我在Silverlight中有一個自定義的基本用戶控件。如何在silverlight中訪問派生用戶控件的指定元素?

<UserControl x:Class="Problemo.MyBaseControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <Border Name="HeaderControl" Background="Red" /> 
    </Grid> 
</UserControl> 

隨着後面

public partial class MyBaseControl : UserControl 
    { 
     public UIElement Header { get; set; } 

     public MyBaseControl() 
     { 
      InitializeComponent(); 
      Loaded += MyBaseControl_Loaded; 
     } 

     void MyBaseControl_Loaded(object sender, RoutedEventArgs e) 
     { 
      HeaderControl.Child = Header; 
     } 
    } 

以下代碼我有一個導出的控制。

<me:MyBaseControl x:Class="Problemo.MyControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:me="clr-namespace:Problemo" 
    d:DesignHeight="300" d:DesignWidth="400"> 
    <me:MyBaseControl.Header> 
     <TextBlock Name="header" Text="{Binding Text}" /> 
    </me:MyBaseControl.Header> 
</me:MyBaseControl> 

後面的代碼在後面。

public partial class MyControl : MyBaseControl 
    { 
     public string Text 
     { 
      get; set; 
     } 

     public MyControl(string text) 
     { 
      InitializeComponent(); 
      Text = text; 
     } 
    } 

我試圖在派生控件中設置標題文本塊的文本值。

能夠設置兩種方式,即使用數據綁定或後面的派生控制代碼,但都不能工作,這將是很好的。通過數據綁定,它不起作用。如果我在後面的代碼中嘗試,我得到'頭'的空引用。這是Silverlight 4中(不知道是否有差別)

如何做到與這兩個數據綁定和代碼有什麼建議?

乾杯

回答

0

首先,我會告訴你如何調整你的派生控制處理這個問題。您需要做兩件事,首先您需要實現INotifyPropertyChanged,然後再將綁定添加到用戶控件。

MyControl的XAML: -

<me:MyBaseControl.Header>  
    <TextBlock Name="headerItem" />  
</me:MyBaseControl.Header> 

MyControl代碼: -

public partial class MyControl : MyBaseControl, INotifyPropertyChanged 
{ 
    public MyControl() 
    { 
     InitializeComponent(); 
     headerItem.SetBinding(TextBlock.TextProperty, new Binding("Text") { Source = this }); 
    } 

    string _text; 
    public string Text 
    { 
     get { return _text; } 
     set { _text = value; NotifyPropertyChanged("Text"); } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    void NotifyPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    #endregion 
} 

這應該讓你的工作。 但是,只要你覺得你需要繼承一個基於UserControl的類,你應該退後一步,詢問是否基類和派生項目應該是模板控件。如果我有時間,我會嘗試從模板控件的角度添加一個代碼版本。

+0

Thanks.The基類是模板(其幾乎是一個窗口,該窗口具有一個標題,內容,最小化/最大化)如果我更改基本控制在這個例子中是一個模板控制,代碼失敗,headerItem被空。有關使它2與模板化基本控件一起工作的任何建議? 公共類MyBaseControl:控制{ 公共的UIElement部首{獲得;設置;} 公共MyBaseControl(){DefaultStyleKey = typeof運算(MyBaseControl);} 公共覆蓋無效OnApplyTemplate(){ base.OnApplyTemplate(); var headerControl = GetTemplateChild(「HeaderControl」)as Border; if(headerControl!= null)headerControl.Child = Header; }} – Mrt 2010-04-12 13:33:38

+0

@Mrt:我並不是建議你應該使用模板控件,只是可能值得考慮。現在你已經揭示了更多關於你在做什麼,是否有任何理由不使用內置的ChildWindow類?順便說一句,代碼不會在註釋中進行格式化,如果您想要在模板化控制方法中發佈另一個問題。 – AnthonyWJones 2010-04-13 06:16:03

+0

已發佈新問題。 http://stackoverflow.com/questions/2627410/how-to-access-a-named-element-in-a-control-that-inherits-from-a-templated-control – Mrt 2010-04-13 07:11:31

相關問題