我正在创建一个包装Infragistics XamDataTree的WPF UserControl。因此,我使用我自己的XAML语法(在此代码中,它是level
)在代码中创建布局,如下所示:
var layout = new NodeLayout
{
Key = level.Description ?? level.NodeType.Name,
TargetTypeName = level.NodeType.Name,
IsExpandedMemberPath = level.IsExpandedMemberPath,
};
var itemTemplate = new DataTemplate(level.NodeType);
var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
stackPanelFactory.Name = level.NodeType.Name + "Factory";
stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
if (!string.IsNullOrEmpty(level.IsCheckedMemberPath))
{
var checkBoxFactory = new FrameworkElementFactory(typeof(CheckBox));
checkBoxFactory.SetBinding(ToggleButton.IsCheckedProperty, new Binding("Data." + level.IsCheckedMemberPath));
if (!string.IsNullOrEmpty(level.IsCheckableMemberPath))
checkBoxFactory.SetBinding(IsEnabledProperty, new Binding("Data." + level.IsCheckableMemberPath));
stackPanelFactory.AppendChild(checkBoxFactory);
}
var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock));
textBlockFactory.SetBinding(TextBlock.TextProperty, new Binding("Data.Name"));
textBlockFactory.AddHandler(ToolTipOpeningEvent, new ToolTipEventHandler(HandleTextBlockToolTipOpening), true);
textBlockFactory.AddHandler(ToolTipClosingEvent, new ToolTipEventHandler(HandleTextBlockToolTipClosing), true);
textBlockFactory.SetValue(ToolTipProperty, " "); // need some value in there to trigger the event
stackPanelFactory.AppendChild(textBlockFactory);
itemTemplate.VisualTree = stackPanelFactory;
layout.ItemTemplate = itemTemplate;
if (level.AllowEdit)
{
layout.EditingSettings.AllowDeletion = false;
layout.EditingSettings.AllowEditing = true;
layout.EditingSettings.IsEnterKeyEditingEnabled = false;
layout.EditingSettings.IsF2EditingEnabled = true;
layout.EditingSettings.IsMouseActionEditingEnabled = TreeMouseEditingAction.DoubleClick;
layout.EditingSettings.IsOnNodeActiveEditingEnabled = false;
var editTemplate = new DataTemplate(level.NodeType);
var editStackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
editStackPanelFactory.Name = level.NodeType.Name + "EditFactory";
editStackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
var textBoxFactory = new FrameworkElementFactory(typeof(TextBox));
textBoxFactory.SetBinding(TextBox.TextProperty, new Binding("Data.Name") { Mode = BindingMode.TwoWay });
textBoxFactory.AddHandler(TextBox.LoadedEvent, new RoutedEventHandler(TextBoxSelectAll), true);
textBoxFactory.AddHandler(TextBox.TextChangedEvent, new TextChangedEventHandler(Target), true);
editStackPanelFactory.AppendChild(textBoxFactory);
editTemplate.VisualTree = editStackPanelFactory;
editTemplate.Seal();
layout.EditorTemplate = editTemplate;
}
Tree.GlobalNodeLayouts.Add(layout);
编辑工作正常,TextBlock
上的事件被正确抛出,但TextBox
上没有任何事件触发。永远。这是我正在做的事情,对EditorTemplate
的限制,XamDataTree
上的怪癖......这看起来对任何人来说都很熟悉吗?
(同样添加这个因为它包含了很多其他的怪癖,几乎没有任何谷歌果汁,并且可能帮助人们无论如何......关键项目是Mode = TwoWay
,Seal()
致电,ToolTip
的空白二传手,VisualTree
作业的顺序......换句话说,上面的代码段代表3天的工作。)