RadListBox DragDropBehavior Binding
Я пытаюсь использовать привязку в DragDropBehavior RadListBox, как это
<UserControl xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" x:Class="MyProject.Views.MyView"
....
xmlns:behaviors="clr-namespace:MyProject.Behaviors"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
...
<telerik:RadListBox ItemsSource="{Binding Items}">
<telerik:RadListBox.DragDropBehavior>
<behaviors:MyDragDropBehavior AllowReorder="True" DropCommand="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.DropCommand}"/>
</telerik:RadListBox.DragDropBehavior>
</telerik:RadListBox>
</Grid>
</UserControl>
Представление получает viewmodel через инъекцию
public partial class MyView : UserControl
{
public MyView (ViewModels.MyViewModel viewModel)
{
InitializeComponent();
DataContext = viewModel;
}
}
Код поведения:
public class MyDragDropBehavior : Telerik.Windows.DragDrop.Behaviors.ListBoxDragDropBehavior
{
public override bool CanDrop(Telerik.Windows.DragDrop.Behaviors.DragDropState state)
{
return state.IsSameControl;
}
public override void Drop(Telerik.Windows.DragDrop.Behaviors.DragDropState state)
{
base.Drop(state);
DropCommand.Execute(null);
}
public ICommand DropCommand
{
get { return (ICommand)GetValue(DropCommandProperty); }
set { SetValue(DropCommandProperty, value); }
}
public static readonly DependencyProperty DropCommandProperty =
DependencyProperty.Register("DropCommand", typeof(ICommand), typeof(MyDragDropBehavior), new PropertyMetadata(null));
}
Привязка предметов работает хорошо. Поведение работает, но привязка к DropCommand - нет. Я получаю ошибку привязки:
Не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType =' System.Windows.Controls.UserControl ', AncestorLevel =' 1 ''. BindingExpression: Path = DataContext.DropCommand; DataItem = NULL; целевой элемент - "MyDragDropBehavior" (HashCode=25707777); Свойство target - "DropCommand" (тип "ICommand")
ViewModel является
public class MyViewModel
{
public MyViewModel()
{
DropCommand = new DelegateCommand(OnDrop);
Items = new ObservableCollection<MyItem>();
}
public ObservableCollection<MyItem> Items { get; set; }
public DelegateCommand DropCommand { get; set; }
private void OnDrop()
{
}
}
Что случилось?
Я нашел способ решить эту проблему, следуя
<telerik:RadListBox DragDropBehavior="{Binding DragDropBehavior}">
Но я все еще не понимаю, почему предыдущий метод не работает. Я буду признателен, если кто-нибудь знает.