我有2个DataTemplates用于在单个ListView中显示ClassA或ClassB的内容;要选择的模板将基于用户的RadioButton选择。
是否可以在运行时根据用户输入更改ListView的ItemTemplate(在XAML中)?
代码片段示例:
XAML页面:
<Page...>
<Page.Resources>
<DataTemplate x:Key="ClassAListViewItemTemplate" x:DataType="vm:ClassA" ... />
<DataTemplate x:Key="ClassBListViewItemTemplate" x:DataType="vm:ClassB" ... />
</Page.Resources>
<RelativePanel>
<RadioButton Content="ClassA" ... />
<RadioButton Content="ClassB" ... />
<ListView DataContext="{Binding Path=MainViewModel}"
ItemsSource="{Binding ListOfClassAOrB, Mode=TwoWay}"
ItemTemplate="{StaticResource ClassAListViewItemTemplate}"/>
</RelativePanel>
</Page>
我已将代码略微删除到基本要素,但我希望能够在运行时更改以下内容:
ItemTemplate="{StaticResource ClassAListViewItemTemplate}"
我见过使用Style.Triggers的Classic WPF应用程序的解决方案,但这些不适用于UWP
Marco Minerva关于Adaptive Triggers, RelativePanel and DataTemplate in the Universal Windows Platform的博客谈论使用DataTemplates中的UserControl来修改使用自适应触发器的视觉状态,但这并没有考虑根据用户输入切换模板< / p>
我发现问题的最接近的答案是他写的另一篇博客&#34; Dynamically choose DataTemplate in WinRT&#34;涉及到代码隐藏元素的地方 - 但它似乎只是一个if语句 - 但它是我迄今为止遇到的最干净的解决方案,以及我想在XAML中复制的内容
由于
答案 0 :(得分:1)
您需要使用覆盖数据模板的SelectTemplateCore。像这样更改您的视图模型。 下面的代码将帮助您。
public class SampleViewModel : DataTemplateSelector
{
public DataTemplate ClassAListViewItemTemplate{ get; set; }
public DataTemplate ClassBListViewItemTemplate{ get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
var itemsData = item as SampleClass; // add your Data class
if (itemsData.IsAddButton == false) // define any property to select the datatemplate
{
return ClassAListViewItemTemplate;
}
else
{
return ClassBListViewItemTemplate;
}
}
}
将两个datatemplates添加到一个键,并将键提供给gridview中的ItemTemplateSelector属性。
<viewModels:SampleViewModel x:Key="FeedbackTempateSelector"
ClassAListViewItemTemplate="{StaticResource ClassAListViewItemTemplate}"
ClassBListViewItemTemplate="{StaticResource ClassBListViewItemTemplate}">
</viewModels:SampleViewModel>