2009-10-28 12 views
22

मैं वर्तमान में एक WPF उपयोगकर्ता नियंत्रण में काम कर रहा हूं (मेरी एक्सएएमएल फ़ाइल का मूल तत्व "UserControl" है), जो मुझे पता है कि एक विंडो के अंदर होस्ट किया जा रहा है। मैं डेटा बाध्यकारी का उपयोग कर विंडो की एक संपत्ति का उपयोग कैसे कर सकता हूं?डब्ल्यूपीएफ डेटा बाइंडिंग के "रिलेटिवसोर्स फाइंडएस्टर" क्या करता है?

क्या किसी को पता है कि क्यों बस

<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="..." /> 

काम नहीं करता है? मुझे प्राप्त त्रुटि संदेश है:

सिस्टम.Windows.Data चेतावनी: 4: संदर्भ 'रिलेटिवसोर्स FindAncestor, पूर्वज/टाइप' सिस्टम के साथ बाध्यकारी के लिए स्रोत नहीं मिल सकता है। Windows.Window ', पूर्वज एलवेल =' 1 ''।

संपादित करें: मैं आर्सेनमार्क के दृष्टिकोण पर भिन्नता का उपयोग करके समाप्त हुआ, इसलिए उसका जवाब स्वीकार कर लिया। हालांकि, मुझे अभी भी यह जानने में दिलचस्पी है कि FindAncestor "बस काम नहीं करता" क्यों है।

+2

आपने कहा कि आपने उसका जवाब अलग किया है, क्या आप वास्तव में क्या पोस्ट कर सकते हैं? – Miles

+0

ध्यान दें कि मैं इस समस्या का समाधान एमवीवीएम पैटर्न के संदर्भ में ढूंढ रहा था। खिड़की की संपत्ति जिसे मैं बांधना चाहता था वास्तव में विंडो के व्यूमोडेल की एक संपत्ति थी। – user200783

+1

ArsenMkrt ने UserControl में एक संपत्ति बनाने और उस पर बाध्यकारी करने का सुझाव दिया, फिर बदले में (XAML में) इस संपत्ति को विंडो की वांछित संपत्ति पर बाध्यकारी। एमवीवीएम पैटर्न के साथ, हालांकि, UserControl XAML में कभी नहीं दिखाई दिया, इसलिए दूसरा भाग संभव नहीं था। – user200783

उत्तर

15

सबसे अच्छा तरीका है एक नाम UserControl

के साथ दो तरह से बाध्यकारी UserControl में निर्भरता संपत्ति MyProperty बनाएँ और मुख्य विंडो में यह बाध्य करने के लिए इस

<UserControl x:Name = "myControl"> 
    <Label Content={Binding ElementName= myControl, Path=MyProperty}/> 
</UserControl> 
+0

लेकिन मैं UserControl पर नहीं, जिसमें विंडो (किसी अन्य XAML फ़ाइल में परिभाषित) पर एक संपत्ति से जुड़ना चाहता हूं। – user200783

+0

उपयोगकर्ता नियंत्रण में संपत्ति रखना बेहतर होगा और उस संपत्ति को विंडो की संपत्ति के साथ बांधें –

+2

क्या आप UserControl में निर्भरता संपत्ति बना सकते हैं? क्या आप खिड़की में उपयोगकर्ता नियंत्रण नहीं जोड़ते हैं?

0

आई थिंक तरह UserControl में बाँध से, दे रहा है आप स्थापित करना चाहिए मोड = इस तरह "OneWayToSource":

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" /> 
4

आप एक ItemsControl यासे 'भागने' करने की कोशिश कर रहे हैं 10 Window पर पहुंचने के लिए आप पाएंगे कि x:Type Window का पूर्वज प्रकार काम नहीं करता है। या कम से कम प्रतीत नहीं होता है ...

यदि ऐसा है तो आप शायद ब्लेंड या विजुअल स्टूडियो चला रहे हैं और डेटा को डिजाइन समय पर दिखाई देने की उम्मीद कर रहे हैं - जो ऐसा नहीं होगा क्योंकि वीएस + दोनों मिश्रण अपने स्वयं के उदाहरण बनाएं जो वास्तव में विंडोज नहीं हैं। यह रनटाइम पर ठीक काम करेगा, लेकिन डिज़ाइन मोड के दौरान नहीं।

वहाँ आप नीचे दिए कुछ कर सकते हैं:

एक UserControl

  • में

    • लपेटें यहाँ एक वैकल्पिक समाधान मैं के साथ आ गया है। इसमें एक फायदा है कि आप UserControl या Window सीधे संदर्भित नहीं कर रहे हैं, इसलिए यदि आप मूल कंटेनर बदलते हैं तो आपका कोड नहीं टूट जाएगा।

      <Window 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:views="clr-namespace:MyWPFApplication.Views" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     
      x:Class="MyWPFApplication.Views.UPCLabelPrinterWindow" 
      mc:Ignorable="d" 
      x:Name="LayoutRoot" 
      Title="UPCLabelPrinterWindow"> 
      
      <views:DataContextWrapper> 
          <DockPanel> 
           ... 
          </DockPanel> 
      </views:DataContextWrapper> 
      

    कहाँ DataContextWrapper सिर्फ एक ग्रिड

    namespace MyWPFApplication.Views { 
        public class DataContextWrapper : Grid 
        { 
    
        } 
    } 
    

    तब होता है जब आप के लिए बाध्य आप ऐसा करते हैं:

    <TextBlock Text="{Binding="{Binding DataContext.SomeText, 
        RelativeSource={RelativeSource AncestorType={x:Type views:DataContextWrapper}, 
        Mode=FindAncestor}}" /> 
    

    नोट: यदि आप करने के लिए बाध्य करना चाहते हैं खिड़की पर एक संपत्ति खुद ही यह trickier है और आपको शायद एक निर्भरता संपत्ति या उसके जैसा कुछ बांधना चाहिए। लेकिन अगर आप एमवीवीएम का उपयोग कर रहे हैं तो यह एक समाधान है जिसे मैंने पाया।

  • +0

    मेरे मामले में 'पूर्वजों टाइप = {x: टाइप विंडो}' बहुत उपयोगी था, क्योंकि 'पूर्वजों टाइप = उपयोगकर्ता नियंत्रण' किसी भी तरह से मेरी खिड़की को इंगित नहीं किया - हालांकि यह सामान्य रूप से करता है। – LuckyLikey