2015-11-03 36 views
0

我有2个DataTemplates用于在单个ListView中显示ClassA或ClassB的内容;要选择的模板将基于用户的RadioButton选择。在运行时动态更改ListView的DataTemplate

是否可以根据用户输入在运行时动态地更改ListView(在XAML中)的ItemTemplate?

的代码示例片段:

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

马可Minerva的使用的DataTemplates内用户控件修改使用Adaptive触发器的可视状态的Adaptive Triggers, RelativePanel and DataTemplate in the Universal Windows Platform会谈的博客,但是这并没有考虑到基于用户输入的模板切换出

最接近的答案我已经找到对我的问题是另一个博客,他写了“Dynamically choose DataTemplate in WinRT”,其中涉及代码隐藏元素 - 但它似乎只是一个if语句 - 但它迄今为止我遇到的最干净的解决方案,以及我想要的复制到XAML中

谢谢

+0

也许[此问题](http://stackoverflow.com/q/33465775/2681948)及其答案将有所帮助。 – Romasz

+0

嗨Romasz,感谢您的回复,但是您建议的问题/答案仍然需要创建一个DataTemplateSelector的子类,其中包含逻辑 - 我更多地寻找避免陷入C#代码的解决方案 - 如果这甚至是可能的话。 DataTemplateSelector子类唯一添加的是If语句,我认为可能有一个简洁的方法来在XAML中执行它 – Alastair

+0

我需要的是类似于[此问题]接受的答案的解决方案(http://stackoverflow.com/questions/146269/change-wpf-datatemplate-for-listbox-item-if-selected)但不使用样式触发器,因为它们在UWP中不可用 – Alastair

回答

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; 
     } 
    } 
} 

将您的两个数据模板添加到一个键,并在GridView中给出ItemTemplateSelector属性的键。

<viewModels:SampleViewModel x:Key="FeedbackTempateSelector" 
    ClassAListViewItemTemplate="{StaticResource ClassAListViewItemTemplate}" 
    ClassBListViewItemTemplate="{StaticResource ClassBListViewItemTemplate}"> 

</viewModels:SampleViewModel> 
+0

在返回语句中,它表示:无法实现将类型“字符串”转换为'Windows.Ui.Xaml.DataTemplate' – K232