と私はTreeViewコントロールでユーザーコントロールを持っている、とのContextMenuたDependencyPropertyを持つ:各TreeViewアイテムにContextMenuをバインドするにはどうすればいいですか?
public ObservableCollection<Control> ContextMenu {
get {
return (ObservableCollection<Control>)GetValue(ContextMenuProperty);
}
set {
SetValue(ContextMenuProperty, value);
}
}
public static readonly DependencyProperty ContextMenuProperty =
DependencyProperty.Register("ContextMenu", typeof(ObservableCollection<Control>), typeof(FilterableTreeViewControl),
new PropertyMetadata(new ObservableCollection<Control>(), new PropertyChangedCallback(FilterableTreeViewControl.OnContextMenuPropertyChange)));
private static void OnContextMenuPropertyChange(DependencyObject d, DependencyPropertyChangedEventArgs e) {
FilterableTreeViewControl ctrl = d as FilterableTreeViewControl;
ctrl.OnContextMenuChange((Object)e.NewValue);
}
protected virtual void OnContextMenuChange(Object NewItemsSource) {
}
XAML:
<controlsToolkit:TreeViewDragDropTarget AllowDrop="True" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Drop="TreeViewDragDropTarget_Drop" AllowedSourceEffects="All">
<controlsToolkit:TreeViewDragDropTarget.Resources>
<Data:HierarchicalDataTemplate x:Key="TreeViewTemplate" ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal" Height="Auto" Width="Auto">
<Image Source="{Binding Type,Converter={StaticResource TreeIconConverter}}" />
<TextBlock x:Name="NameTextBlock" Text="{Binding Name}">
<controlsInputToolkit:ContextMenuService.ContextMenu>
<controlsInputToolkit:ContextMenu ItemsSource="{Binding ElementName=MyTreeViewControl, Path=ContextMenu}" />
</controlsInputToolkit:ContextMenuService.ContextMenu>
</TextBlock>
</StackPanel>
</Data:HierarchicalDataTemplate>
</controlsToolkit:TreeViewDragDropTarget.Resources>
<Controls:TreeView Name="treeView" ItemTemplate="{StaticResource TreeViewTemplate}">
</Controls:TreeView>
</controlsToolkit:TreeViewDragDropTarget>
用法:
<my:MyControl
DragEnabled="False"
ItemsSource="{Binding TreeRootNodes}"
FilterCaption="Filter:"
SelectionChangedCommand="{Binding SelectedMachineGroupChangedCommand_L}"
DropCommand="{Binding DropCommand}">
<my:FilterableTreeViewControl.ContextMenu>
<controlsInputToolkit:MenuItem Header="Menu 1" />
<controlsInputToolkit:MenuItem Header="Menu 2" />
<controlsInputToolkit:MenuItem Header="Menu 3" />
</my:MyControl.ContextMenu>
</my:MyControl>
まず作業はすべて罰金が、 2番目の後に私は明らかに "要素は既に別の要素の子です"例外。
コードビハインドを使わずにバインディングだけで解決できるのですか?
非常に良いアイデア、ありがとう! – Aaaaaaaa
これは動作しますが、MenuItemsにコマンドをバインドすることはできません: '動作しません。 ElementNameを変更した場合、バインディング例外は発生しません。何か案が? –
Aaaaaaaa
あなたには何の例外がありますか?あなたは 'MyMainPage'またはResourceDictionaryでこのバインディングを定義していますか? – fsong