我有 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 的经典 WPF 应用程序的解决方案,但这些解决方案不适用于 UWP
Marco Minerva 的博客 Adaptive Triggers, RelativePanel and DataTemplate in the Universal Windows Platform讨论使用 DataTemplates 中的 UserControls 来使用自适应触发器修改视觉状态,但这没有考虑到根据用户输入切换出模板
我发现的最接近我的问题的答案是他写的另一个博客“Dynamically choose DataTemplate in WinRT ”,其中涉及代码隐藏元素 - 但它似乎只是一个 if 语句 - 但它是我拥有的最干净的解决方案到目前为止遇到的问题,以及我想在 XAML 中复制的内容
谢谢
最佳答案
您需要使用覆盖数据模板的SelectTemplateCore。像这样改变你的 View 模型。 下面的代码会对您有所帮助。
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;
}
}
}
将两个数据模板添加到一个键,并将该键赋予 gridview 中的 ItemTemplateSelector 属性。
<viewModels:SampleViewModel x:Key="FeedbackTempateSelector"
ClassAListViewItemTemplate="{StaticResource ClassAListViewItemTemplate}"
ClassBListViewItemTemplate="{StaticResource ClassBListViewItemTemplate}">
</viewModels:SampleViewModel>
关于xaml - 在运行时动态更改 ListView 的 DataTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33501558/