How to associate view with viewmodel or multiple DataTemplates for ViewModel?

前端 未结 1 942
名媛妹妹
名媛妹妹 2020-12-06 02:20

Given I have a GridView and I want to navigate to a different page by clicking each item.

How can navigate to a view associated to the viewmodel?

In WPF ther

相关标签:
1条回答
  • 2020-12-06 02:56

    In WPF, the DataType is a dependency property which can be retrieved in runtime.

    In UWP, the x:DataType is compile-time property, you cannot get the value in runtime.

    I created a simple demo about how to map the datatype and data template in UWP through DataTemplateSelector.

    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 讨论(0)
提交回复
热议问题