我有一个与this one相关的问题:我正在尝试将事件附加到我的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>"
答案 0 :(得分: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...
}
}