gpt4 book ai didi

xaml - 如何将 View 与ViewModel或ViewModel的多个DataTemplates关联?

转载 作者:行者123 更新时间:2023-12-04 03:26:27 26 4
gpt4 key购买 nike

给定我有一个GridView,并且我想通过单击每个项目导航到另一个页面。

如何导航到与 View 模型关联的 View ?

在WPF中,有一种方法可以为 View 模型设置多个Datatemplates。

<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的值显示相应的 View 。

Visual Studio告诉我DataTemplate必须具有一个key属性,但是即使那样,它也不能像在WPF中那样工作,因为它没有创建 View 。

我知道DataType被替换为x:DataType,而x:Type似乎消失了。有没有办法达到类似的结果?

最佳答案

在WPF中,DataType是可以在运行时检索的依赖项属性。

在UWP中,x:DataType是compile-time属性,您无法在运行时获取该值。

我创建了一个有关如何通过DataTemplateSelector映射UWP中的数据类型和数据模板的简单演示。

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>

关于xaml - 如何将 View 与ViewModel或ViewModel的多个DataTemplates关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33252915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com