2017-11-22 15 views
0

基本的に、私は非常に単純なカスタムコントロールを作成しました。これはポップアップから派生しています。私はリストボックスのデータ型の中でそのポップアップを使いたいので、それぞれのリストアイテムはそれを持っています。しかし、私はこのエラーメッセージを受け取ります "指定された要素はすでに別の要素の論理的な子です。最初に切断してください"、このメッセージの意味を知っているので、これを過去に処理しなければなりませんでした。しかし、この特定のシナリオで私はなぜ私が最初にそれを得るのか分からない。リストボックスのデータ型でカスタムコントロールを使用しているときに例外が発生する理由

public class MyPopup : Popup 
{ 
    static MyPopup() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyPopup), new FrameworkPropertyMetadata(typeof(MyPopup))); 
    } 
} 

私はこのカスタムコントロールを変更した場合は(一般的なファイルである)それのためのスタイル

<Style x:Key="MyPopupStyle" TargetType="{x:Type local:MyPopup}"> 
    <Setter Property="Placement" Value="MousePoint" /> 
    <Setter Property="Child"> 
     <Setter.Value> 
      <Border 
       Width="100" 
       Height="100" 
       Background="HotPink" /> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="IsOpen" Value="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.IsMouseOver, Mode=OneWay}" /> 
</Style> 

メインウィンドウ

<Window.Resources> 
    <DataTemplate x:Key="Foo"> 
     <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <TextBlock x:Name="TextBlock" Text="Hover over" /> 
      <wpfApp1:MyPopup PlacementTarget="{Binding ElementName=TextBlock}" /> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 
<ListBox ItemTemplate="{StaticResource Foo}" ItemsSource="{Binding MyList}" /> 

コードが

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     MyList = new List<string>{"Dan","John","Test"}; 
     DataContext = this; 
    } 
    public List<string> MyList { get; } 
} 

後ろに導出しますコントロールからポーを入れてそのコントロールテンプレート内の子犬は、それだけでうまく動作しますが、私はこのポップアップからこのビューを消費するときにアクセスしたいプロパティを失います。私はそれを回避するために依存プロパティを作成することができますが、理想的にはここで何が起こるかを知りたいと思います。ありがとうございました。

答えて

2

Styleは、すべてMyPopupの子としてBorderという1つのインスタンスを設定します。

WPFコントロールには1つの親しか存在できません。それはうまくいかない。

代わりに、ControlTemplateまたはDataTemplateを使用する必要があります.ContentTemplateまたはDataTemplateは、コントロールインスタンスごとにコンテンツのコピーを作成します。

+0

ありがとうございます。残念ながら、Popupコントロールにはテンプレートプロパティがないため、ControlTemplateを使用することはできません。ポップアップのためにそれ以外の方法がありますか? – adminSoftDK

関連する問題