将事件处理程序附加到代码生成的数据模板

4
我有一个与这个相关的问题:我试图将事件附加到我的StackPanel,但在使用XamlReader时似乎没有连接成功。我无法让ChildItem_Load方法被调用。有人知道如何解决吗?
除了这个事件外,代码都可以正常工作。
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>"
1个回答

5

好的,我想出了一个“hack”的解决方案,但它可以工作。

因为看起来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...
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接