0

このように 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}">

しかし、なぜ以前の方法が機能しないのかはまだわかりません。誰かが知っているなら、私は感謝します。

4

0 に答える 0