2008-09-16 10 views
18

WPF UserControls विकसित करते समय, उपयोगकर्ता नियंत्रण की निर्भरता प्रॉपर्टी के रूप में बाल नियंत्रण की निर्भरता प्रजनन का पर्दाफाश करने का सबसे अच्छा तरीका क्या है? निम्नलिखित उदाहरण दिखाता है कि मैं वर्तमान में UserControl के अंदर टेक्स्टबॉक्स की टेक्स्ट प्रॉपर्टी का खुलासा कैसे करूं। निश्चित रूप से इसे पूरा करने के लिए एक बेहतर/सरल तरीका है?निर्भरता निर्भरता प्रॉपर्टी

<UserControl x:Class="WpfApplication3.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="LightCyan"> 
     <TextBox Margin="8" Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
    </StackPanel> 
</UserControl> 


using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication3 
{ 
    public partial class UserControl1 : UserControl 
    { 
     public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new PropertyMetadata(null)); 
     public string Text 
     { 
      get { return GetValue(TextProperty) as string; } 
      set { SetValue(TextProperty, value); } 
     } 

     public UserControl1() { InitializeComponent(); } 
    } 
} 

उत्तर

17

है यही कारण है कि हम इसे कैसे हमारी टीम में, RelativeSource खोज के बिना, कर रहे हैं बल्कि UserControl नामकरण और UserControl के नाम से गुण का हवाला।

<UserControl x:Class="WpfApplication3.UserControl1" x:Name="UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="LightCyan"> 
     <TextBox Margin="8" Text="{Binding Path=Text, ElementName=UserControl1}" /> 
    </StackPanel> 
</UserControl> 

कभी कभी हम अपने आप को मिल गया है, हालांकि बहुत सी चीज़ें UserControl की रही है, और अक्सर कई बार हमारा उपयोग वापस बढ़ाया है। मैं PART_TextDisplay या कुछ के आधार पर उस टेक्स्टबॉक्स की तरह चीजों को नाम देने की परंपरा का भी पालन करता हूं, ताकि भविष्य में आप इसे टेम्पलेट कर सकें, फिर भी कोड को पीछे छोड़ दें।

+0

इस तरह सिल्वरलाइट 4 में सबसे अच्छा काम करता है, जहां कोई 'FindAncestor' –

+0

यह मेरे लिए काम किया, लेकिन यह आप कर सकते हैं की तरह प्रतीत नहीं होता उसी 'x: कक्षा' और' x: नाम' का उपयोग करें। मुझे 'WpfAplication1.SliderLabel' जैसी कक्षा थी और मैंने इसे' स्लाइडर लेबल कैंट्रोल 'नाम दिया। अन्यथा यह शिकायत की गई कि नाम पहले से मौजूद है। –

1

आप UserControl के कन्स्ट्रक्टर में डेटाकॉन्टेक्स्ट सेट कर सकते हैं, फिर केवल पथ से बांधें।

सीएस:

DataContext = this; 

XAML:

<TextBox Margin="8" Text="{Binding Text} /> 
+1

यह केवल सीमित पैमाने पर काम करता है। यदि आपको वास्तव में डेटाकॉन्टेक्स्ट की आवश्यकता है तो आप खराब हो गए हैं –