2011-11-22 10 views
5

मैं निम्नलिखित नमूना डेटा है, जो अच्छी तरह से बाहर काम करता है ...अभिव्यक्ति मिश्रण में डिज़ाइन डेटा का पुन: उपयोग करें?

<SampleData:DashboardViewModel xmlns:SampleData="clr-namespace:MyApp.ViewModels"> 
    <SampleData:DashboardViewModel.Employees> 
     <SampleData:EmployeeViewModel FirstName="Aaron" "Adams" /> 
     <SampleData:EmployeeViewModel FirstName="Billy" "Bob" /> 
     <SampleData:EmployeeViewModel FirstName="Charlie" "Chaplin" /> 
    </SampleData:DashboardViewModel.Employees> 
</SampleData:DashboardViewModel> 

हालांकि, मैं लगता है कि यह नमूना कर्मचारियों की उस सूची का पुन: उपयोग करने के लिए यह हर बार पुन: लिखने के बजाय सक्षम होने के लिए उपयोगी होगा की है। मैं यह नहीं समझ सकता कि उस सूची का पुन: उपयोग कैसे करें। मूल रूप से, मैं एक और SampleData फ़ाइल (SampleEmployees.xaml) जो कर्मचारियों की उस सूची है, तो शामिल करने के लिए है कि मेरे अन्य नमूनों में सक्षम हो शामिल हैं ...

<SampleData:DashboardViewModel xmlns:SampleData="clr-namespace:MyApp.ViewModels"> 
    <SampleData:DashboardViewModel.Employees ... /> <!-- What goes in there? --> 
</SampleData:DashboardViewModel> 

<SampleData:OtherViewModel xmlns:SampleData="clr-namespace:MyApp.ViewModels"> 
    <SampleData:OtherViewModel.Employees ... /> <!-- What goes in there? --> 
</SampleData:OtherViewModel> 

इसके अलावा, कैसे में अलग से सूची बनाने के लिए करना चाहते हैं एक और एक्सएएमएल फ़ाइल ??

ViewModel:

public class DashboardViewModel : NotificationObject 
{ 
    public class DashboardViewModel(IDataService dataService) 
    { 
     InternalEmployees = new ObservableCollection<EmployeeViewModel>(dataService.GetEmployees()); 
     Employees = new ReadOnlyObservableCollection<EmployeeViewModel>(InternalEmployees); 
    } 

    private ObservableCollection<EmployeeViewModel> InternalEmployees { get; set; } 
    public ReadOnlyObservableCollection<EmployeeViewModel> Employees { get; private set; } 
} 
+0

मुझे नहीं लगता कि यह डिफ़ॉल्ट सिस्टम के साथ संभव है। मुझे लगता है कि किसी को एक स्रोत फ़ाइल को पार्स करने के लिए [कस्टमटूल] (http://www.google.com/search?q=visual+studio+custom+tool) बनाना होगा जो तब एक और डिज़ाइन डेटा फ़ाइल उत्पन्न करेगा। यह पुनः टाइप करने से रोक देगा, लेकिन परिणामी जेनरेट की गई फ़ाइल में अभी भी पूर्ण डेटा होगा (अन्य डेटा के लिए "संदर्भ" नहीं)। –

+0

तो मूल रूप से मुझे इसे माइक्रोसॉफ्ट कनेक्ट में एक सुझाव में बदलने की जरूरत है? –

+0

इसके लिए जाएं।ध्यान दें कि वीएस2011 देव पूर्वावलोकन में है, और ब्लेंड 5 एक समान चरण में है, इसलिए यदि वे इसका समर्थन नहीं करते हैं, तो भी मैं उन्हें इस सुविधा को लागू करने की पूर्ववत नहीं करता ... –

उत्तर

0

कुछ मामलों इस आसान है, उन की आवश्यकता होती है:

  1. संग्रह संपत्ति IEnumerable प्रकार का है या IList (नहीं एक वर्ग लागू)
  2. संपत्ति एक सेटटर है

उदा। public IEnumerable Employees { get; set; }

सबसे पहले आप संसाधन संसाधन शब्दकोश में आइटम निकालते हैं, उदाहरण के लिए

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:obj="clr-namespace:Test.Objects"> 
    <x:Array x:Key="SampleEmps" Type="obj:Employee"> 
     <obj:Employee Name="Skeet" Occupation="Programmer" /> 
     <obj:Employee Name="Skeet" Occupation="Programmer" /> 
     <obj:Employee Name="Dimitrov" Occupation="Programmer" /> 
    </x:Array> 
</ResourceDictionary> 

फिर आप एक नियंत्रण जो ViewModels शामिल होंगे की MergedDictionary है कि जोड़ें। जैसे

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Objects/SampleData.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <!-- ... --> 

तो फिर तुम तो संग्रह StaticResource का उपयोग कर देख सकते हैं:

<obj:SomeOtherViewModel Employees="{StaticResource SampleEmps}"/> 

अब विशेष संग्रह के साथ समस्या यह है कि आप बस उन्हें XAML में नहीं बना पा रहा है। और एक लापता सेटटर के साथ समस्या यह है कि आप StaticResource का उपयोग करके संपत्ति असाइन नहीं कर सकते हैं, इसलिए मुझे लगता है कि एक सेटटर हमेशा आवश्यक है।

यदि आपके पास एक विशेष संग्रह है तो आप एक उदाहरण बनाने के लिए MarkupExtension का उपयोग कर सकते हैं।

[ContentProperty("Items")] 
public class GenericCollectionFactoryExtension : MarkupExtension 
{ 
    public Type Type { get; set; } 
    public Type T { get; set; } 
    public IEnumerable Items { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var genericType = Type.MakeGenericType(T); 
     var list = Activator.CreateInstance(genericType) as IList; 
     if (list == null) throw new Exception("Instance type does not implement IList"); 
     foreach (var item in Items) 
     { 
      list.Add(item); 
     } 
     return list; 
    } 
} 

आप या तो सीधे संसाधनों में उदाहरण के लिए एक ObservableCollection बना सकते हैं या आप पाइप स्थान पर इस विस्तार के माध्यम से सरणी आप आइटम की जरूरत है, जहां:

xmlns:om="clr-namespace:System.Collections.ObjectModel;assembly=System" 
<obj:SomeViewModel x:Key="SomeVM"> 
    <obj:SomeViewModel.Employees> 
     <me:GenericCollectionFactory Type="{x:Type om:ObservableCollection`1}" 
            T="{x:Type obj:Employee}"> 
      <StaticResource ResourceKey="SampleEmps" /> 
     </me:GenericCollectionFactory> 
    </obj:SomeViewModel.Employees> 
</obj:SomeViewModel> 

`1om:ObservableCollection के अंत में आवश्यक है क्योंकि प्रकार सामान्य है।

+0

मुझे मौका मिलने पर मुझे यह कोशिश करनी होगी ... हालांकि, इसमें थोड़ी गंध है। मुझे विंडो संसाधनों में अपना नमूना डेटा बनाने का विचार पसंद नहीं है। –

+0

@ एम-वाई: आप उपरोक्त मार्कअप एक्सटेंशन का विस्तार कर सकते हैं या दूसरे कोड में संसाधन शब्दकोश के हार्ड संदर्भ के बिना फ्लाई पर संसाधन प्राप्त कर सकते हैं। –

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