2011-04-05 74 views
1

我使用了由BEA Stollnitz(http://bea.stollnitz.com/blog/?p=53)提供的示例代码,以使拖放在我的申请下降,拖累装饰器等无法访问拖累装饰器模板

一切正常,我拖装饰者很好地展示,我有我想要的所有行为。

但是(是的,总是有一个但是),我不能访问Drag Adorner的DataTemplate,以便根据拖动的数据显示不同的数据。

我简化了代码,但基本知识仍然存在。

这是我DragAdorner的DataTemplate中

<DataTemplate x:Key="DragAndDropTemplate" DataType="{x:Type MyType}"> 
     <Grid> 
      <Grid Opacity="0.5"> 
       <Border x:Name="HeaderBorder" CornerRadius="2" BorderThickness="1" Margin="5,2,5,2"> 
        <Border x:Name="InsideBorder" CornerRadius="2" BorderThickness="1"> 
         <TextBlock x:Name="number" Text="{Binding Name}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/> 
        </Border> 
       </Border> 
      </Grid> 
      <Border Width="17" Height="17" BorderBrush="White" HorizontalAlignment="Center" VerticalAlignment="Center" CornerRadius="1" x:Name="numberContainer" Visibility="Collapsed"> 
       <TextBlock x:Name="number" Text="80" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/> 
      </Border> 
     </Grid> 
    </DataTemplate> 

这是创建装饰器的代码:

if (this.draggedAdorner == null) 
     { 
      var adornerLayer = AdornerLayer.GetAdornerLayer(source); 
      this.draggedAdorner = new DraggedAdorner(draggedData, dataTemplate, source, adornerLayer); 
     } 

这是由init装饰器的代码

public DraggedAdorner(List dragDropData, DataTemplate dragDropTemplate, FrameworkElement adornedElement, AdornerLayer adornerLayer) 
     : base(adornedElement) 
    { 
     this.adornerLayer = adornerLayer; 
     this.contentPresenter = new ContentPresenter(); 

     this.contentPresenter.Content = dragDropData[0]; 

     this.contentPresenter.ContentTemplate = dragDropTemplate; 
     this.adornerLayer.Add(this); 
    } 

draggedData将是MyType的列表,我将第一个项目作为ContentPresenter o的内容f我的DraggedAdorner,所以DataTemplate可以应用。

问题是,我想访问DataTemplate的numberContainer和数字控件,以便在装饰器中显示拖动对象的数量。但无论我尝试什么,我都无法设法访问它,它以“此操作仅对应用此模板的元素有效”结束。信息。

我已经因子评分我可以做这样的事情:

this.contentPresenter.ContentTemplate.FindName("number", this.contentPresenter); 

由于DataTemplate中应适用于ContentPresenter,但没了...... 的信息,adornedElement是从中拖动出现的ListViewItem。

如果你有什么想法?

回答

1

好了,我已经找到了如何实现我想要的东西。

我不知道为什么它之前没有想到,为什么我之前没有发现任何关于此的内容。

我试图访问模板之前刚刚加了一行:

this.UpdateLayout() 

看起来它迫使ContentPresenter和DataTemplate的对象进行更新,“重rederend”所以ContentPresenter是真的模板我的DataTemplate。