2015-10-21 3 views
9

यह देखते हुए कि मेरे पास ग्रिड व्यू है और मैं प्रत्येक आइटम पर क्लिक करके किसी दूसरे पृष्ठ पर नेविगेट करना चाहता हूं।व्यूमोडेल के लिए व्यूमोडेल या एकाधिक डेटा टेम्पलेट्स के साथ दृश्य को कैसे जोड़ें?

व्यूमोडेल से जुड़े दृश्य पर नेविगेट कैसे कर सकते हैं?

डब्ल्यूपीएफ में व्यूमोडेल के लिए एकाधिक डेटामैप्लेट सेट करने का एक तरीका है।

<TabControl Grid.Row="1" Margin="0" ItemsSource="{Binding Tabs}" SelectedIndex="0" SelectedItem="{Binding SelectedTab}"> 
    <TabControl.Resources> 
     <DataTemplate DataType="{x:Type dashboard:DashboardViewModel}"> 
      <dashboard:DashboardView/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type controls:ExchangeViewModel}"> 
      <controls:ExchangeView/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type request:RequestViewModel}"> 
      <request:RequestView/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type addresses:AddressViewModel}"> 
      <addresses:AddressView/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type settings:ExchangeSettingsViewModel}"> 
      <settings:ExchangeSettingsView/> 
     </DataTemplate> 

    </TabControl.Resources> 
    <TabControl.ItemTemplate> 
     <DataTemplate DataType="vm:ViewModelBase"> 
      <TextBlock Text="{Binding Header}" FontSize="14"></TextBlock> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
</TabControl> 

यह वही है मैं अपने विशेष मामले में UWP में करने की कोशिश की है:

<Frame Grid.Row="1" DataContext="{x:Bind ViewModel.Value}"> 
    <Frame.Resources> 
     <DataTemplate x:DataType="viewModels:ExampleViewModel1"> 
      <views:ExampleView1></views:ExampleView1> 
     </DataTemplate> 
     <DataTemplate x:DataType="viewModels:ExampleViewModel2"> 
      <views:ExampleView2></views:ExampleView2> 
     </DataTemplate> 
    </Frame.Resources> 
</Frame> 

फ्रेम एक पेज का हिस्सा है और मैं ViewModel के मूल्य के आधार पर इसी दृश्य दिखाना चाहते हैं।

विजुअल स्टूडियो मुझे बताता है कि डेटा टेम्पलेट के पास एक महत्वपूर्ण विशेषता है, लेकिन फिर भी यह काम नहीं करता है क्योंकि यह डब्ल्यूपीएफ में होगा, क्योंकि यह दृश्य नहीं बना रहा है।

मुझे पता है कि डेटाटाइप को x के साथ प्रतिस्थापित किया गया था: डेटा टाइप और एक्स: टाइप चला गया प्रतीत होता है। क्या समान परिणाम प्राप्त करने का कोई तरीका है?

+1

आप एक 'ContentPresent का उपयोग कर माना जाता है अपने दृश्य मॉडल को प्रदर्शित करने के लिए er'? –

+0

मैं यूडब्लूपी में बैठे बैठने के बारे में अधिक जानकारी जोड़ने जा रहा हूं, क्योंकि टैबकंट्रोल केवल एक उदाहरण है। – Andre

+0

इस [लिंक] के लिए UserVoice पर एक धागा है (https://wpdev.uservoice.com/forums/110705- यूनिवर्सल- विन्डोज़- प्लेटफार्म/सुझाव/18575131-add-implicit-datatemplates-to-uwp) – Portikus

उत्तर

13

डब्ल्यूपीएफ में, डेटाटाइप एक निर्भरता संपत्ति है जिसे रनटाइम में पुनर्प्राप्त किया जा सकता है।

यूडब्ल्यूपी में, एक्स: डेटाटाइप संकलन-समय की संपत्ति है, आप रनटाइम में मान नहीं प्राप्त कर सकते हैं।

मैंने डेटा टेम्पलेट चयनकर्ता के माध्यम से यूडब्ल्यूपी में डेटाटाइप और डेटा टेम्पलेट को मैप करने के तरीके के बारे में एक सरल डेमो बनाया है।

DataTemplateSelector:

namespace UWPApp 
{ 
    public class Template 
    { 
     public string DataType { get; set; } 

     public DataTemplate DataTemplate { get; set; } 
    } 

    public class TemplateCollection2 : System.Collections.ObjectModel.Collection<Template> 
    { 
    } 


    public class MyDataTemplateSelector : DataTemplateSelector 
    { 
     public TemplateCollection2 Templates { get; set; } 

     private IList<Template> _templateCache { get; set; } 

     public MyDataTemplateSelector() 
     { 

     } 

     private void InitTemplateCollection() 
     { 
      _templateCache = Templates.ToList(); 
     } 

     protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
     { 
      if (_templateCache == null) 
      { 
       InitTemplateCollection(); 
      } 

      if(item != null) 
      { 
       var dataType = item.GetType().ToString(); 

       var match = _templateCache.Where(m => m.DataType == dataType).FirstOrDefault(); 

       if(match != null) 
       { 
        return match.DataTemplate; 
       } 
      } 

      return base.SelectTemplateCore(item, container); 
     } 
    } 
} 

ViewModel:

namespace UWPApp 
{ 
    public class ViewModel1 
    { 
     public string Text1 { get; set; } 
    } 

    public class ViewModel2 
    { 
     public string Text2 { get; set; } 
    } 
} 

XAML:

<Grid 
    x:Name="container" 
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.Resources> 
     <local:TemplateCollection2 x:Key="templates"> 
      <local:Template DataType="UWPApp.ViewModel1"> 
       <local:Template.DataTemplate> 
        <DataTemplate x:DataType="local:ViewModel1"> 
         <StackPanel> 
          <TextBlock Text="{Binding Text1}"></TextBlock> 
          <TextBlock Text="From template1"></TextBlock> 
         </StackPanel> 
        </DataTemplate> 
       </local:Template.DataTemplate> 
      </local:Template> 
      <local:Template DataType="UWPApp.ViewModel2"> 
       <local:Template.DataTemplate> 
        <DataTemplate x:DataType="local:ViewModel2"> 
         <StackPanel> 
          <TextBlock Text="{Binding Text2}"></TextBlock> 
          <TextBlock Text="From template2"></TextBlock> 
         </StackPanel> 
        </DataTemplate> 
       </local:Template.DataTemplate> 
      </local:Template> 
     </local:TemplateCollection2> 
     <local:MyDataTemplateSelector 
     x:Key="myDataTemplateSelector" Templates="{StaticResource templates}"> 
     </local:MyDataTemplateSelector> 
    </Grid.Resources> 
    <StackPanel> 
     <Button x:Name="button" Click="button_Click">Click Me</Button> 
     <ContentControl x:Name="stage" ContentTemplateSelector="{StaticResource myDataTemplateSelector}"> 

     </ContentControl> 
    </StackPanel> 
</Grid> 
+0

बहुत धन्यवाद । यह काम करने के लिए वास्तव में एक पिटा है। –

+2

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

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