このように RadListBox の DragDropBehavior でバインディングを使用しようとしています
<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>
ビューはインジェクションを介してビューモデルを取得します
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) です。ターゲット プロパティは 'DropCommand' (タイプ 'ICommand') です。
ビューモデルは
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}">
しかし、なぜ以前の方法が機能しないのかはまだわかりません。誰かが知っているなら、私は感謝します。