2010-10-26 8 views
13

मेरे पास एक टैबकंट्रोल है और प्रत्येक टैब में एक ही यूआई हो सकता है लेकिन विभिन्न डेटा के साथ। किसी भी टैब में उपयोगकर्ता एक बटन पर क्लिक कर एक पॉपअप ला सकता है। यह व्यूमोडेल को एक स्टाइल प्रॉपर्टी सेट करता है जो बताता है कि पॉपअप यूआई के लिए किस शैली का उपयोग करना है। शैली एक कस्टम DependecyProperty से जुड़ा हुआ है जो एक कस्टम PopupUserControl से जुड़ा हुआ है।त्रुटि "निर्दिष्ट तत्व पहले से ही किसी अन्य तत्व का तार्किक बच्चा है"?

निर्दिष्ट तत्व पहले से ही एक और तत्व की तार्किक बच्चा है: मेरी समस्या यह है कि पॉपअप के 2 प्रतिलिपि अन्य टैब में खोला हो जाता है जब, मैं (चाहे क्या शैली लागू किया जाता है) निम्न त्रुटि प्राप्त है। इसे पहले डिस्कनेक्ट करें।

ButtonClick आदेश:

MyViewModel vm = ((Button)sender).DataContext as MyViewModel; 
if (vm != null) 
{ 
    Style popupStyle = (Style)Application.Current.FindResource("SomePopupStyle"); 
    vm.EditPanelStyle= popupStyle ; 
} 

यह कौन सा ViewModelBase

protected virtual void OnPropertyChanged(string propertyName) 
{ 
    this.VerifyPropertyName(propertyName); 

    PropertyChangedEventHandler handler = this.PropertyChanged; 
    if (handler != null) 
    { 
     var e = new PropertyChangedEventArgs(propertyName); 
     handler(this, e); 
    } 
} 

में त्रुटि होती है में OnPropertyChanged ईवेंट ट्रिगर शैली

public Style EditPanelStyle 
{ 
    get { return _editPanelStyle; } 
    set 
    { 
     if (_editPanelStyle != value) 
     { 
      _editPanelStyle = value; 
      OnPropertyChanged("EditPanelStyle"); 
     } 
    } 
} 

पर एक PropertyChange ईवेंट ट्रिगर करता है लाइनViewModelBase

संपादित में

TabItem एक कैनवास और पैनलों/ले जाया गया/आदि हटा जोड़ा/जा सकता है कि का एक समूह होता है। प्रत्येक पैनल की अपनी संसाधन निर्देशिका होती है। पैनल के भीतर से मैं पॉपअप स्टाइल बस ठीक कर सकता हूं और बिना किसी समस्या के इसे लागू किया जाता है। पैनलों के भीतर उपयोग की जाने वाली शैली को पैनलResourceDictionary में भी परिभाषित किया गया है।

असफल होने वाले लोगों के साथ मुख्य अंतर और स्टाइल सफल होने पर शैली अलग-अलग स्थानों में स्थित है।

संपादित करें # 2 शैली है कि नाकाम रहने - LookupDialog एक कस्टम WPF UserControl

<!-- Popup Style for LookupDialog --> 
<Style x:Key="LookupDialogBaseStyle" TargetType="{x:Type localControls:DraggablePanel}" BasedOn="{StaticResource GenericPopupStyle}"> 
    <Setter Property="Canvas.Left" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}}, 
     Path=ActualWidth, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.25}" /> 
    <Setter Property="Canvas.Top" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}}, 
     Path=ActualHeight, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.3}" /> 
    <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}}, 
     Path=ActualWidth, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.5}" /> 
    <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}}, 
     Path=ActualHeight, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.4}" /> 

    <!--<Setter Property="localControls:PopupPanel.PopupEnterKeyCommand" Value="{Binding Path=SaveCommand}" />--> 
    <Setter Property="localControls:PopupPanel.PopupEscapeKeyCommand" Value="{Binding Path=CancelCommand}" /> 

    <Setter Property="Header" Value="{Binding Path=Header}" /> 
    <Setter Property="localControls:PopupPanel.BackgroundOpacity" Value="0" /> 

    <Setter Property="Content"> 
     <Setter.Value> 
      <localControls:LookupDialog 
       DataContext="{Binding}" 
       BorderBrush="{StaticResource DarkColor}" /> 
     </Setter.Value> 
    </Setter> 
</Style> 

<!-- Base Style for a Popup (DraggablePanel) --> 
<Style x:Key="GenericPopupStyle" TargetType="{x:Type localControls:DraggablePanel}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type localControls:DraggablePanel}"> 
       <Border Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"> 
        <DockPanel> 
         <!-- Header --> 
         <Border 
          DockPanel.Dock="Top" 
          MinHeight="20" 
          Background="{DynamicResource TabItem_BackgroundBrush_Unselected}" 
          BorderBrush="{StaticResource DarkColor}" 
          BorderThickness="1" 
          CornerRadius="5,5,0,0" 
          Padding="2,3,2,2" 
          SnapsToDevicePixels="True" 
          > 

          <ContentPresenter x:Name="PART_DraggablePanelHeader" ContentSource="Header" /> 
         </Border> 

         <!-- Content --> 
         <Border Background="{StaticResource DefaultBackground}" 
           BorderBrush="{StaticResource DarkColor}" 
           BorderThickness="1,0,1,1" 
           SnapsToDevicePixels="True"> 
          <ContentPresenter ContentSource="Content" /> 
         </Border> 
        </DockPanel> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

शैली काम करता है जो:

<!-- Example Popup Style for a Panel --> 
<Style x:Key="AgentDesktop_NotesPanelPopupStyle" TargetType="{x:Type ContentControl}"> 
    <Setter Property="Canvas.Left" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}}, 
     Path=ActualWidth, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.2}" /> 
    <Setter Property="Canvas.Top" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}}, 
     Path=ActualHeight, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.32}" /> 
    <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}}, 
     Path=ActualWidth, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.6}" /> 
    <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}}, 
     Path=ActualHeight, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.36}" /> 

    <Setter Property="localControls:PopupPanel.PopupEnterKeyCommand" Value="{Binding Path=SaveCommand}" /> 
    <Setter Property="localControls:PopupPanel.PopupEscapeKeyCommand" Value="{Binding Path=HidePopupCommand}" /> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <!-- Control Template removed to make this easier to read, but it's created from standard WPF controls with nothing special --> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

उत्तर

20

मेरी समस्या यह थी कि मैं अपनी शैली में Content सेट कर रहा था, और Content में एक लॉजिकल पैरेंट नहीं हो सकता है। मुझे इसके बजाय Template पर स्थानांतरित करने की आवश्यकता थी। चूंकि मैं बेस स्टाइल खोना नहीं चाहता था, इसलिए मैंने सामग्री को ContentTemplate हेड्रेडकंटेंट कंट्रोल (मेरे कोड में ड्रैगगेबल पैनेल) की संपत्ति में सेट किया था।

डेवी को +1 किसी भी तरह से मुझे इस माध्यम से चलने में मदद करने के लिए।

+0

पर कहां थी, ऐसा लगता है कि सामग्री को प्रत्येक नियंत्रण के लिए अद्वितीय संसाधन भी होना चाहिए। कम से कम यही है कि मेरी छवियों को शैली के लिए 2 टॉगल बटनों के लिए उपयोग की जाने वाली छवियों को बदलने के लिए आवश्यक है। – Dave

+0

@ डेव या तो अनोखा, या किसी प्रकार का टेम्पलेट। कंट्रोल टेम्पलेट, डेटा टेम्पलेट, कंटेंट टेम्पलेट इत्यादि – Rachel

8

सुनिश्चित करें कि आप एक नया टैब वस्तु बनाने और कर रहे हैं आप एक ही टैब को टैब नियंत्रण में दूसरी बार डालने की कोशिश नहीं कर रहे हैं। एक नियंत्रण में केवल 1 माता-पिता हो सकते हैं और ऐसा लगता है कि आप किसी भी टैब को 2 अलग-अलग कंटेनरों में डालने की कोशिश कर रहे हैं, या एक ही टैब नियंत्रण को दो बार अधिक संभावना है।

+0

यह निश्चित रूप से एक अलग टैबकंट्रोल है। इस बात से मैं इतनी निराश क्यों हूं कि मैंने टैबकंट्रोल के अंदर से उसी तरह पॉपअप स्टाइल सफलतापूर्वक सेट किया है, केवल अंतर यह है कि यह पॉपअप अपने बच्चों के बजाय टैबकंट्रोल से ही सेट हो रहा है। एचआरआरएम मैं अपने प्रश्न – Rachel

+0

@ राहेल में इस पर विस्तार करूंगा क्या आप दिखा सकते हैं कि संपादनपैन स्टाइल के लिए क्या बाध्य है? मुझे नहीं लगता कि आपके द्वारा दिखाया गया कोड सीधे है जहां त्रुटि झूठ है। यदि आपके पास PropertyChanged ईवेंट को स्पष्ट रूप से संभालने वाला कोई कोड नहीं है तो त्रुटि xaml-side डेटाबेस में होने की संभावना है। – Davy8

+0

मुझे लगता है कि आप सही हैं, मैं बस कुछ परीक्षण चला रहा था और ऐसा लगता है कि स्टाइल स्वयं समस्या उत्पन्न कर रहा है, न कि कोड। मैं शैली – Rachel

-1

संक्षिप्त उत्तर ऊपर के सभी पढ़ा नहीं करने के लिए है: आप (या तो शैली या ContentControl के प्रत्यक्ष घोषणा अपने XAML में) Template को Content बदलने की जरूरत है।

संबंधित मुद्दे