2

MVVMを使用してWPFでドラッグアンドドロップを作成しようとしています

ここで DragDropHelper を使用したソリューションを提案するBea Stollnitz http://bea.stollnitzからこのリンクを見つけました: https://github.com/bstollnitz/old-wpf-blog/tree/master/46-DragDropListBox

しかし、データテンプレートのボタンやラジオボタンなどのコンポーネントを生成するいくつかのイベントでカスタマイズしようとすると、ドラッグアンドドロップでこのエラーが発生します

「装飾を持たない要素の装飾にアクセスできません。」

この行で

this.adornerLayer.Update(this.AdornedElement);

bea.stollnitz.com/files/46/DragDropListBox.zip をダウンロードすると、簡単に再現できます。

そして交換

    <DataTemplate x:Key="pictureTemplate">
        <DataTemplate.Resources>
            <Style TargetType="Image">
                <Setter Property="Width" Value="50" />
                <Setter Property="Height" Value="50" />
                <Setter Property="Margin" Value="10" />
            </Style>
        </DataTemplate.Resources>
            <Image Source="{Binding Path=Location}" />
    </DataTemplate>

    <DataTemplate x:Key="pictureTemplate">
        <DataTemplate.Resources>
            <Style TargetType="Image">
                <Setter Property="Width" Value="50" />
                <Setter Property="Height" Value="50" />
                <Setter Property="Margin" Value="10" />
            </Style>
        </DataTemplate.Resources>
        <Grid>
            <Image Source="{Binding Path=Location}" />
            <RadioButton />
        </Grid>
    </DataTemplate>

つまり、テンプレートにラジオボタンを追加します

私はすでにいくつかのリンクを見つけましたが、問題を解決する明確な方法を説明しているものはありません。

WPF 装飾層に渡されるイベントはありません

このコードを追加することを提案する

VisualCollectionのvisualChildren; FrameworkElement @オブジェクト;

public CustomAdorner(UIElement adornedElement) :
    base(adornedElement)
{
    visualChildren = new VisualCollection(this);
    @object = new Button {Content = "prova"};
    visualChildren.Add(@object);
}
protected override Visual GetVisualChild(int index)
{
    return visualChildren[index];
}

しかし、私はそれを追加する場所と、このリンクについても同じことを確信しています

http://social.msdn.microsoft.com/Forums/en/wpf/thread/e6643abc-4457-44aa-a3ee-dd389c88bd86?prof=必須

提案する

private bool IsItemDisconnected(object item)
{
  bool isDisconnected = false;

  var itemType = item.GetType();
  if (itemType.FullName.Equals("MS.Internal.NamedObject"))
  {
    isDisconnected = true;
  }

  return isDisconnected;
}

この最後のリンクは.NET 4の問題について話していますが、3.5にもバグがあります

4

1 に答える 1

1

私はこれに対する解決策を見つけたことをここに投稿したいと思いました。ドラッグドロップエラーを読んだ後:装飾がない要素の装飾にアクセスできません

if (this.adornerLayer != null && this.contentPresenter.Content != null)
{
    this.adornerLayer.Update(this.AdornedElement);
}
于 2012-11-21T22:13:09.993 に答える