2011-12-14 21 views
6

मान लें कि मेरे पास एक कस्टम नियंत्रण है जो दूसरे नियंत्रण को लपेटता है (उदाहरण के लिए MyCustomButton)। मैं एक संपत्ति सामग्री है, जो आंतरिक नियंत्रण लपेटता बेनकाब:चेनिंग निर्भरताप्रॉपर्टीज

public object Content 
    { 
     get { return innerControl.Content; } 
     set { innerControl.Content = value; } 
    } 

आदेश में के लिए एक उपभोक्ता इस संपत्ति के लिए बाध्य करने के लिए, मैं इसके लिए एक DependencyProperty परिभाषित करने की जरूरत:

public static DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof (object), typeof (MyCustomButton)); 

लेकिन अब मैं की जरूरत है

public object Content 
    { 
     get { return GetValue(ContentProperty); } 
     set { SetValue(ContentProperty, value); } 
    } 

तो मैं आंतरिक नियंत्रण का मूल्य अब और लपेटकर नहीं कर रहा हूँ: मेरी संपत्ति परिभाषा getValue/setValue उपयोग करने के लिए।

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

अद्यतन: मैं सिर्फ बटन से प्राप्त नहीं कर सकता क्योंकि मेरे उपयोगकर्ता नियंत्रण में कई अन्य चिंताएं हैं।

क्या ऐसा करने का कोई बेहतर तरीका है?

उत्तर

2

ठीक है, आप उपयोगकर्ता नियंत्रण के साथ बटन को लपेटने के विवरण के आधार पर, आप बटन से विरासत में प्राप्त कस्टम नियंत्रण को परिभाषित कर सकते हैं। फिर, बटन को लपेटने और लपेटने वाली विधियों और गुणों को उजागर करने के बजाय, आप उन तरीकों और गुणों को ओवरराइड कर सकते हैं जिनके व्यवहार आप कस्टम नियंत्रण को परिभाषित करना चाहते हैं। इस तरह, आपको पहिया को फिर से शुरू करने की आवश्यकता के बिना बटन की सभी कार्यक्षमता मिल जाएगी।

यहाँ एक गूगल लिंक है कि यह से अवगत है (पहला यह है कि मैंने पाया में से एक - वहाँ बहुत सारे हैं): http://knol.google.com/k/creating-custom-controls-with-c-net#

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

संपादित करें: अद्यतन सवाल के प्रकाश ...

में आप इन पंक्तियों के साथ कुछ कर सकते हैं।

<Grid> 
    <local:MyControl ButtonContent="Click Me!"/> 
</Grid> 
</Window> 

यहाँ है उपयोगकर्ता नियंत्रण के लिए ही XAML:

<UserControl x:Class="GuiScratch.MyControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:GuiScratch" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 

     <StackPanel> 
      <ContentControl Content="Asdf"/> 
      <Button Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}},Path=ButtonContent}"/> 
     </StackPanel> 

    </Grid> 
</UserControl> 

यहाँ और, पीछे कोड है: यहाँ अपने उपयोगकर्ता नियंत्रण से ग्राहक की XAML है

public partial class MyControl : UserControl 
{ 

    public static readonly DependencyProperty ButtonContentProperty = 
    DependencyProperty.Register("ButtonContent", typeof(object), typeof(MyControl), 
    new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender)); 

    public object ButtonContent 
    { 
     get { return (object)GetValue(ButtonContentProperty); } 
     set { SetValue(ButtonContentProperty, value); } 
    } 

    public MyControl() 
    { 
     InitializeComponent(); 
    } 
} 

तो, आपको कोड के माध्यम से बाध्यकारी को संभालने की आवश्यकता नहीं है। आपका क्लाइंट एक्सएएमएल आपकी निर्भरता संपत्ति से जुड़ा हुआ है, जैसा उपयोगकर्ता के XAML स्वयं को नियंत्रित करता है। इस फैशन में, वे निर्भरता संपत्ति सेटिंग साझा करते हैं। मैंने इसे अपने छोटे स्क्रैचपैड में चलाया, और नतीजा यह है कि (कम से कम मेरी समझ) जो आप खोज रहे हैं। मुख्य विंडो उपयोगकर्ता नियंत्रण को "एएसडीएफ" टेक्स्ट के साथ एक स्टैक पैनल के रूप में प्रदर्शित करती है और फिर "मुझे क्लिक करें" टेक्स्ट वाला एक बटन दिखाती है।

+0

उपयोगकर्ता नियंत्रण में अन्य चिंताएं हैं। अद्यतन प्रश्न – Jeff

+0

क्या आप विशेष रूप से अपने उपयोगकर्ता नियंत्रण की "सामग्री" संपत्ति का उपयोग करना चाहते हैं?यदि नहीं, तो आप हमेशा एक अलग निर्भरता संपत्ति का पर्दाफाश कर सकते हैं और अपने उपयोगकर्ता नियंत्रण में कुछ मूल्य जोड़ सकते हैं। –

+0

मुझे परवाह नहीं है कि इसे क्या कहा जाता है। लेकिन मैं चाहता हूं कि संपत्ति का मूल्य विशेष रूप से आंतरिक नियंत्रण पर कुछ हो। – Jeff

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