2009-10-30 102 views
4

我有一個與this one有關的問題:我嘗試將一個事件附加到我的StackPanel,但在使用XamlReader時它不會連接。我無法獲取調用ChildItem_Load方法。有誰知道一種方法來做到這一點?將事件處理程序附加到代碼生成的DataTemplate

除了這個事件代碼工作正常。

this._listBox.ItemTemplate = (DataTemplate) XamlReader.Load(
        @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> 
          <Border> 
           <StackPanel Loaded=""ChildItem_Loaded""> 
            <TextBlock Text=""{Binding " + this._displayMemberPath + @"}"" /> 
           </StackPanel> 
          </Border> 
         </DataTemplate>" 

回答

5

好吧,我想出了一個有點「黑客」的解決方案,但它的工作原理。

由於看起來XamlReader在創建DataTemplate時沒有任何有關本地名稱空間的知識,因此我擴展了StackPanel並將Load事件「烘焙」。這不完全理想,但它的工作原理:

this._listBox.ItemTemplate = (DataTemplate) XamlReader.Load(
    @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
        xmlns:foo=""clr-namespace:Foo;assembly=Foo""> 
     <Border> 
      <foo:ExtendedStackPanel> 
       <TextBlock Text=""{Binding " + this._displayMemberPath + @"}"" /> 
      </foo:ExtendedStackPanel> 
     </Border> 
    </DataTemplate>" 
    ); 

和擴展類:

public class ExtendedStackPanel : StackPanel 
{ 
    public ExtendedStackPanel() : base() 
    { 
     this.Loaded += new RoutedEventHandler(this.ChildItem_Loaded); 
    } 

    private void ChildItem_Loaded(object sender, RoutedEventArgs e) 
    { 
     // Logic here... 
    } 
} 
+0

尼斯的答案 - 謝謝! – edtheprogrammerguy 2013-05-23 20:39:10

相關問題