xaml - 在运行时动态更改 ListView 的 DataTemplate

标签 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 的经典 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/

相关文章:

c# - 将 URI 打包到引用程序集中的资源

c# - C# XAMARIN.FORMS 中的 BorderBrush

windows - 如何防止“打开方式”对话框一直出现在 Windows 应用商店应用程序中?

c# - 获取录音音量(UWP)

windows - 等效于 system.Reflection.Assembly.GetExecutingAssembly().FullName

c# - UWP 设置 NavigationView TogglePaneButton 颜色

c# - 将 ComboBox 的 SelectedValue 绑定(bind)到 WPF 中的枚举

xaml - Metro 风格 XAML ScrollViewer 中的统一文本缩放

c# - 禁用取消选择项目的功能

c# - Microsoft 的反馈中心现在使我的 UWP 应用程序崩溃