2015-11-03 61 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