在运行时动态更改ListView的DataTemplate

时间:2015-11-03 14:26:15

标签: xaml winrt-xaml uwp

我有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中复制的内容

由于

1 个答案:

答案 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>