2016-08-03 66 views
1

我有一個ListView的ItemsSource我在代碼後面編程設置。我曾經只有一個模板,但現在我想使用多個模板,並根據我添加到ListView的項目選擇模板。ItemTemplateSelector不工作的ListView沒有綁定

這是XAML代碼我有:

<Page.Resources> 
<local:TemplateSelector x:Key="myTemplateSelector" TemplateA="{StaticResource TemplateA}" TemplateB="{StaticResource TemplateB}" /> 

<!-- TemplateA and TemplateB --> 
</Page.Resources> 

<ListView 
     x:Name="MasterListView" 
     Grid.Row="1" 
     ItemContainerTransitions="{x:Null}" 
     ItemTemplateSelector="{StaticResource myTemplateSelector}" 
     IsItemClickEnabled="True" 
     ItemClick="MasterListView_ItemClick"/> 

我然後設置ListView控件的的ItemSource,這是我TemplateSelector:

public class TemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate TemplateA { get; set; } 
    public DataTemplate TemplateB { get; set; } 

    public new DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 

     return TemplateA; 
    } 
} 

但是,這是行不通的。而不是我想要的模板,我總是爲每個項目獲得相同的文本:AppName.ViewModels.ViewModel1(我想要顯示的數據的類型)。

在過去,當我只有我在XAML中使用這一項的ItemTemplate,它的工作:

 <ListView 
     x:Name="MasterListView" 
     Grid.Row="1" 
     ItemContainerTransitions="{x:Null}" 
     ItemTemplate="{StaticResource TemplateA}" 
     IsItemClickEnabled="True" 
     ItemClick="MasterListView_ItemClick"/> 

我怎樣才能獲得ItemTemplateSelector工作?我在那裏放置了斷點,但它甚至沒有被調用。

回答

2

因爲它在描述備註/DataTemplateSelector.SelectTemplate(Object, DependencyObject) method

App code typically doesn't call SelectTemplate methods; the methods exists so that the infrastructure can call it while choosing the correct templates based on using a DataTemplateSelector instance from a property value such as ItemsControl.ItemsTemplateSelector. To provide a specific template in a derived class, override the SelectTemplateCore(Object, DependencyObject) method.

所以我們應該用

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 

,而不是

public new DataTemplate SelectTemplate(object item, DependencyObject container) 
1
public override DataTemplate SelectTemplate(object item, DependencyObject container) 

代替

public new DataTemplate SelectTemplate(object item, DependencyObject container) 

編輯,由於訪問修飾符,這是4.5.2的標記(注意這是公共的):

#region Assembly PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\PresentationFramework.dll 
#endregion 

namespace System.Windows.Controls 
{ 
// 
// Summary: 
//  Provides a way to choose a System.Windows.DataTemplate based on the data object 
//  and the data-bound element. 
public class DataTemplateSelector 
{ 
    // 
    // Summary: 
    //  Initializes a new instance of the System.Windows.Controls.DataTemplateSelector 
    //  class. 
    public DataTemplateSelector(); 

    // 
    // Summary: 
    //  When overridden in a derived class, returns a System.Windows.DataTemplate based 
    //  on custom logic. 
    // 
    // Parameters: 
    // item: 
    //  The data object for which to select the template. 
    // 
    // container: 
    //  The data-bound object. 
    // 
    // Returns: 
    //  Returns a System.Windows.DataTemplate or null. The default value is null. 
    public virtual DataTemplate SelectTemplate(object item, DependencyObject container); 
} 
} 
+0

當我嘗試這一點,我得到以下錯誤:TemplateSelector.SelectTemplate(對象的DependencyObject)「:無法更改訪問修飾符當重寫」保護'繼承成員'DataTemplateSelector.SelectTemplate(object,DependencyObject)' – slimshady

+0

奇怪,我猜是另一個框架版本?但是,您應該重寫而不是新的。我更新了我的帖子,對於我來說,訪問修飾符是公開的。 – user1515791