2013-03-02 8 views
5

ठीक है, यह कुछ हद तक इस प्रश्न से संबंधित है: WPF Printing multiple pages from a single View ModelMVVM + UserControl + निर्भरता संपत्ति

मैं वहाँ दी सलाह का पालन करने की कोशिश की लेकिन अब मैं अटक कर रहा हूँ।

मेरा आवेदन एक MainView.xaml और उचित MainViewViewModel.cs, मैं पृष्ठभूमि में MVVM लाइट का उपयोग कर रहा उपयोग करता है।

अब - पोस्ट के अनुसार - ऐसा लगता है मुझे क्या करना निम्नलिखित है:

  • सुनिश्चित करें कि दृश्य मॉडल इन चलता

    • एक उपयोगकर्ता नियंत्रण
    • बनाएं उपयोगकर्ता नियंत्रण से कुछ गुण का पर्दाफाश गुण

    विचार स्पष्ट है लेकिन मैं एक-दूसरे को सूचित करने की कोशिश करते समय अटक गया हूं।

    मेरे उपयोगकर्ता नियंत्रण (UcTest.xaml) को उजागर करता एक निर्भरता संपत्ति:

    public string SpecialText 
    { 
        get { return (string)GetValue(SpecialTextProperty); } 
        set 
        { 
         SetValue(SpecialTextProperty, value); 
    
        } 
    } 
    
    // Using a DependencyProperty as the backing store for SpecialText. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty SpecialTextProperty = 
        DependencyProperty.Register("SpecialText", typeof(string), typeof(UcTest), new PropertyMetadata(new PropertyChangedCallback(SpecialTextChangedPropertyCallback))); 
    
    private static void SpecialTextChangedPropertyCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
        // Do something 
        Debug.WriteLine("Ffgdgf"); 
    } 
    

    ठीक है, इसलिए मैं अब एक उपयोगकर्ता नियंत्रण जो कुछ निर्भरता गुण है की क्या ज़रूरत है। फिर भी, ये गुण पूरी तरह से मेरे व्यूमोडेल गुणों से अलग हैं (वे हैं जिन्हें प्रदर्शित किया जाएगा)।

    तो बुनियादी तौर पर मैं दो संभावनाएं हैं:

    • कैसे मैं अब UserControl के लिए मेरे ViewModel बता सकता है कि कुछ गुण बदल गया है?
    • क्या निर्भरता गुणों को भूलने और सीधे दृश्य मॉडल तक पहुंचने की संभावना है?

    अतिरिक्त जानकारी # 1: Example Project: मैं मैं क्या यहाँ करने के लिए कोशिश कर रहा हूँ की एक (सरल) उदाहरण अपलोड कर दिया है। मैं अपने MainViewViewModel से UserControl1 (UserControl1 के लिए ViewModel में बाइंडिंग प्रॉपर्टी के माध्यम से) में लेबल का मान बदलना चाहता हूं।

  • +0

    डेटा बाध्यकारी –

    +1

    का उपयोग करें इसका मतलब यह होगा कि मेरे उपयोगकर्ता नियंत्रण को INOTifyPropertyChanged को लागू करने की आवश्यकता होगी जो मूल रूप से मेरा ViewModel करना चाहिए। –

    उत्तर

    4

    ठीक है, घंटों के बाद गुगलिंग यह प्रतीत होता है कि इसका "सही" दृष्टिकोण यह नहीं करना है। सामान्य दृष्टिकोण डेटा को आपके मेनव्यू मॉडेल में रखना है और उपयोगकर्ता नियंत्रण के लिए अतिरिक्त व्यूमोडल का उपयोग नहीं करना है (जो मुझे थोड़ा लगता है ... अच्छा .. इतना अच्छा नहीं)। मुख्य समस्या यह है कि निर्भरता संपत्ति से डेटा को ViewModel में प्राप्त करने के लिए कोई आसान तंत्र नहीं है।

    प्रिंटिंग के लिए, अब मैं इसे कोड में पूरी तरह से करने के लिए वापस चला गया हूं।

    +0

    यह उन मामलों पर लागू हो सकता है जहां आप उपयोगकर्ता नियंत्रण में टैब आइटम अलग करते हैं। लेकिन सामान्य नियंत्रण के बारे में क्या, एक फ़ाइल ब्राउज़र की तरह, जो कई बार प्रदर्शित होते हैं? – bytecode77

    +0

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

    5

    आप आमतौर पर ViewModel संपत्ति में UserControl की संपत्ति bind करेंगे। एक दो-तरफा बाध्यकारी दोनों दिशाओं में, ViewModel से देखने के लिए और इसके विपरीत काम करेगा।

    <Window x:Class="TestApplication.MainWindow" ...> 
        <Window.DataContext> 
         <local:MyViewModel/> 
        </Window.DataContext> 
        <Grid> 
         <local:UcTest SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/> 
        </Grid> 
    </Window> 
    

    सीधे ऊपर के उदाहरण में ViewModel वस्तु का उपयोग करने के लिए, आप बस ViewModel प्रकार के UserControl के DataContext संपत्ति डाली सकता है। DataContext को मेनविंडो से विरासत में मिला है।

    var viewModel = DataContext as MyViewModel; 
    var property = viewModel.MyViewModelProperty; 
    

    आप निश्चित रूप से भी सीधे एक विशेष ViewModel उदाहरण UserControl के DataContext को आवंटित कर सकते हैं:

    <local:UcTest SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/> 
        <local:UcTest.DataContext> 
         <local:UserControlViewModel/> 
        </local:UcTest.DataContext> 
    </local:UcTest> 
    

    या आप एक संसाधन शब्दकोश में एक संसाधन के रूप ViewModel उदाहरण बना सकते हैं और निर्दिष्ट कर सकते हैं DataContext इस

    <local:UcTest DataContext="{StaticResource MyUserControlViewModel}" 
           SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/> 
    
    +0

    एचएम, मुझे लगता है कि मैं आपको गलत समझा सकता हूं। समस्या यह है कि UserControl का अपना व्यूमोडल है जिसे मैं बांधना चाहता हूं। या क्या आपको लगता है कि गुणों को MainViewModel में रखना बेहतर होगा और केवल UserControl का उपयोग अपने स्वयं के व्यूमोडेल के बिना करें? –

    +0

    यह आपके एप्लिकेशन डिज़ाइन पर निर्भर करता है। दोनों वैध समाधान हैं। आप UserControl की DataContext प्रॉपर्टी को सीधे असाइन कर सकते हैं। – Clemens

    +1

    एचएम, नहीं .. मुझे वास्तव में यह समझ में नहीं आता है। क्या आप एक उदाहरण पोस्ट करना चाहते हैं? क्योंकि जैसे ही मैं UserControlViewModel पर UserControl के लिए DataContext को बदलता हूं, मैं किसी भी चर को असाइन नहीं कर सकता क्योंकि UserControl इन गुणों के बारे में नहीं जानता है। यदि स्पेशलटेक्स्ट कोई निर्भरता प्रॉपर्टी नहीं है तो मैं "स्पेशलटेक्स्ट" को कुछ कैसे सौंप सकता हूं? –

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