2009-10-30 3 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

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