2010-02-17 24 views
8

के अंदर एक कस्टम निर्भरता प्रॉपर्टी के लिए बाध्यकारी सेट करना मेरे पास एक WPF UserControl है जिसमें एक कस्टम निर्भरता प्रॉपर्टी है जिसका नाम MyDP है। मैं इसे अपने व्यू मॉडेल पर एक संपत्ति में बांधना चाहता हूं (जिसे UserControl के DataContext के रूप में इंजेक्शन दिया गया है)। मैं एक तरह से इस तरह के रूप माता पिता खिड़की के XAML में UserControl की घोषणा में बाध्यकारी निर्धारित करके यह करने के लिए पता है:एक WPF उपयोगकर्ता नियंत्रण

<Window x:Class="MyNamespace.Views.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:views="clr-namespace:MyNamespace.Views"> 
    <StackPanel> 
     <views:MyControl MyDP="{Binding Path=MyVMProperty, Mode=OneWayToSource}"/> 
    </StackPanel> 
</Window> 

यह ठीक काम करता है, लेकिन जैसा कि एक वैकल्पिक मैं सेट कर सकते हैं UserControl के XAML अंदर बंधन, समान मैं UserMontrol के अंदर व्यक्तिगत नियंत्रण के लिए व्यूमोडेल के अन्य गुणों के लिए बाइंडिंग कैसे सेट करता हूं?

उत्तर

15

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

<UserControl.Style> 
    <Style> 
     <Setter Property="views:MyControl.MyDp" Value="{Binding Path=MyVMProperty, Mode=OneWayToSource}" /> 
    </Style> 
</UserControl.Style> 
+0

कि पूरी तरह से काम किया है, धन्यवाद! इस डब्ल्यूपीएफ नोब के लिए सबसे स्पष्ट दृष्टिकोण नहीं है, लेकिन आपकी व्याख्या निश्चित रूप से स्थिति को स्पष्ट करती है। –

+0

धन्यवाद। मेरे लिए भी अच्छा काम किया, हालांकि मुझे लगता है कि मैं यूसी को डेटाकॉन्टेक्स्ट में बांधना चाहता था, इसलिए वनटाइम मेरे लिए सही तरीका था। – GarethJ

+0

बहुत उपयोगी। धन्यवाद। – tronious

1

तुम भी MainWindow के निर्माता में बाध्यकारी, इस तरह निर्धारित कर सकते हैं:

public MainWindow() 
{ 
    InitializeComponent(); 
    SetBinding(MyDPProperty, "MyVMProperty"); 
} 
संबंधित मुद्दे