2017-11-22 16 views
0

기본적으로 팝업에서 파생 된 매우 간단한 사용자 정의 컨트롤을 만들었습니다. 각 목록 상자 항목을 가질 수 있도록 해당 팝업을 목록 상자 datatemplate 안에 사용하고 싶습니다. 하지만이 오류 메시지가 나타납니다. "지정된 요소는 이미 다른 요소의 논리적 인 자식입니다. 먼저 연결을 끊습니다."이 메시지의 의미를 알고 있으며, 나는 이것을 과거에 처리해야했습니다. 그러나이 특정한 시나리오에서 나는 왜 그것을 처음에 얻는 지 이해하지 못합니다.목록 상자 데이터 템플릿에서 사용자 정의 컨트롤을 사용할 때 예외가 발생하는 이유

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> 

MainWindow를

<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의 단일 인스턴스를 자식으로 설정합니다.

WPF 컨트롤에는 단일 부모 만있을 수 있습니다. 그것은 작동하지 않습니다.

대신 ControlTemplate 또는 DataTemplate을 사용해야합니다. ControlTemplate 또는 DataTemplate은 각 컨트롤 인스턴스에 대해 해당 내용의 별도 복사본을 만듭니다.

+0

답장을 보내 주셔서 감사합니다. 아쉽게도 Popup 컨트롤에는 템플릿 속성이 없으므로 ControlTemplate을 사용할 수 없습니다. 거기에 어떤 다른 길 arround 그것, 팝업 들어 있습니까? – adminSoftDK