2009-03-11 6 views
13

MVVM -पटलर का उपयोग करके आप डेटा कॉन्टेक्स्ट को एक विशिष्ट व्यूमोडेल पर सेट करते हैं। अब XAML को डेटाकॉन्टेक्स्ट के प्रकार को बताने का कोई तरीका है ताकि वह मेरी बाइंडिंग को मान्य कर सके?क्या मुझे डब्ल्यूपीएफ/एक्सएएमएल में मजबूती से टाइपिंग बाइंडिंग मिल सकती है?

एएसपी.नेट एमवीसी में टाइप किए गए व्यूडेटा की तरह कुछ ढूंढ रहे हैं।

उत्तर

3

नहीं, वर्तमान स्पेक में Xaml में मजबूत टाइपिंग नहीं है। मेरा मानना ​​है कि नेट 4.0 के साथ, एक्सएमएल जेनरिक के लिए क्षमता को देखना चाहिए। इसके साथ, मुझे लगता है कि Xaml में मजबूत टाइपिंग होना बहुत आसान होना चाहिए।

3

आप प्रत्येक व्यक्ति एक जोरदार टाइप तरह से बाध्यकारी लिख सकते हैं:

<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" /> 

हालांकि इस तथ्य यह है कि पाठ बॉक्स DataContext ViewModel.Site प्रकार का है मान्य नहीं होगा (और मुझे लगता है कि यह संभव नहीं है, लेकिन शायद मैं गलत हो सकता हूँ)।

0

इस प्रयास करें:

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
      ... 
     </DataTemplate> 
    </Window.Resources> 

    <ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" /> 
</Window> 

मैं इस कोड का परीक्षण नहीं किया है, लेकिन यह आप से पता चलना चाहिए। सामग्री प्रस्तुतकर्ता वर्तमान डेटा कॉन्टेक्स्ट प्रदर्शित करेगा जो डेटा टेम्पलेट का उपयोग करेगा। यह संकलक में दृढ़ता से टाइप नहीं किया गया है लेकिन लोड पर तुरंत रनटाइम त्रुटि फेंक देगा (विंडो के InitializeComponent में)। कुछ तोड़ने पर आपको अपने परीक्षण में इसे आसानी से पकड़ने में सक्षम होना चाहिए।

+0

.NET 3.5 में डेटा टेम्पलेट नहीं है।TargetType संपत्ति –

+0

@ ब्रायन आप सही हैं, यह डेटा टाइप है। मैंने कहा कि यह अवांछित था। मैंने त्रुटि को ठीक करने के लिए उत्तर अपडेट किया। –

2

सं। FrameworkElement.DatatContext निर्भरता संपत्ति है जो डेटा बाध्यकारी प्रकार object प्रकार सक्षम करती है।

जैसा कि अन्य लोगों द्वारा इंगित किया गया है, आप DataContext को DataTemplate नामक विशेष टेम्पलेट के लिए अपेक्षित प्रकार निर्दिष्ट कर सकते हैं। ItemsControl, ControlControl जैसे कई नियंत्रण डेटा टेम्पलेट्स तक पहुंच प्रदान करते हैं ताकि आप डेटा कॉन्टेक्स्ट के प्रकार के दृश्य प्रतिनिधित्व की अपेक्षाओं को सेट कर सकें।

ब्रायन सही है, उसने अपने कोड का परीक्षण नहीं किया।

एक टाइप किया DataTemplate का सही आवेदन इस तरह दिखता है:

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
     ... 
     </DataTemplate> 
    </Window.Resources> 
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" /> 
</Window> 

ContentPresenter FrameworkElement से सीधे विरासत और एक खाका संपत्ति नहीं है। इसके अलावा, टेम्पलेट प्रॉपर्टी आमतौर पर ControlTemplate के नियंत्रण। टेम्पलेट को संदर्भित करती है जो डेटा टेम्पलेट से बिल्कुल अलग है।

मुझे लगता है कि ब्रायन ContentControl के बारे में सोच रहा था जो दो रूट नियंत्रण प्रकारों में से एक है (दूसरा ItemsControl है)। ContentControl वास्तव में नियंत्रण से प्राप्त होता है। इसलिए यदि हम चुनते हैं तो हम उस पर टेम्पलेट संपत्ति निर्दिष्ट कर सकते हैं।

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
     ... 
     </DataTemplate> 
     <ControlTemplate x:Key="ControlSkin" TargetType="{x:Type ContentControl}"> 
     ... 
     </ControlTemplate> 
    </Window.Resources> 
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" Template="{StaticResource ControlSkin}" /> 
</Window> 
1

मैं व्यक्तिगत रूप से इस एक्स का उपयोग कर मेरी viewmodel की प्रत्येक प्रॉपर्टी में संदर्भ के लिए एक स्थिर PropertyPath घोषित: बाध्यकारी पथ के रूप में स्थिर - जैसे

public class MyViewModel 
{ 
    public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty"); 
    public bool MyProperty{get; set;} 
} 

XAML: {Binding Path={x:Static local:MyViewModel.MyPropertyPath}}

इस तरह सभी मेरी बाइंडिंग बिल्ड पर मान्य हो जाती है।

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