2013-02-22 110 views
21

मैं एक संक्षिप्त रूप से युग्मित एमवीवीएम डब्ल्यूपीएफ एप्लीकेशन लिख रहा हूं और माता-पिता वीएम में बाल वीएम कक्षा के उदाहरणों के बजाय इंटरफेस हैं, उदा।इंटरफ़ेस के लिए DataTemplate डेटाटाइप को कैसे बाध्य करें?

public IChildViewModel { get; set; } 

अब मैं डेटा टेम्पलेट का उपयोग करके इस संपत्ति को कैसे प्रस्तुत करूं? जैसे:

<DataTemplate DataType="{x:Type contracts:IChildViewModel}"> 

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

+1

'ContentControl' का उपयोग करने के बारे में क्या है जो' DataTrigger' पर आधारित 'ContentTemplate' सेट करता है जो डेटाकॉन्टेक्स्ट और इंटरफ़ेस को 'IValueConverter' से गुजरता है? फिर आप परीक्षण कर सकते हैं कि मान पैरामीटर के साथ पास किए गए प्रकार का है, और यदि सही उपयुक्त डेटा टेम्पलेट – Rachel

उत्तर

7

आप WPF स्पष्ट रूप से कह रहा है कि आप एक अंतरफलक क्षेत्र के लिए बाध्य कर रहे हैं द्वारा इंटरफेस करने के लिए बाध्य कर सकते हैं:

(कृपया ध्यान दें कि ViewModelBase बस एक आधार स्तरीय कि INotifyPropertyChanged इंटरफ़ेस लागू करता है)

public class Implementation : ViewModelBase, IInterface 
{ 
    private string textField; 

    public string TextField 
    { 
     get 
     { 
      return textField; 
     } 
     set 
     { 
      if (value == textField) return; 
      textField = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

public interface IInterface 
{ 
    string TextField { get; set; } 
} 

तब ViewModel पर:

private IInterface interfaceContent; 
public IInterface InterfaceContent 
{ 
    get { return interfaceContent; } 
} 

और अंत में Xaml संभव बनाता है कि:

<ContentControl Grid.Row="1" Grid.Column="0" Content="{Binding InterfaceContent}"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate DataType="{x:Type viewModels:IInterface}"> 
      <TextBox Text="{Binding Path=(viewModels:IInterface.TextField)}"/> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

जैसा कि आप देख सकते हैं, बाध्यकारी स्पष्ट रूप से 'IInterface' definiton को संदर्भित करता है।

+0

का उपयोग करता है तो क्या यह वास्तव में काम करता है? मेरा मानना ​​है कि एक्सएएमएल प्रकार प्रणाली इंटरफेस पर विचार नहीं करती है, जैसा कि यहां चर्चा की गई है: http://badecho.com/2012/07/adding-interface-support-to-datatemplates/ हालांकि यह संकलित हो सकता है। मुझे संदेह है कि यह उम्मीद के अनुसार काम करता है। – Gui

+0

दरअसल, मैंने अभी कोशिश की: यह संकलित है लेकिन डेटा टेम्पलेट लागू नहीं है। – ckuepker