2012-01-09 11 views
1

WPF ListBoxでItemTemplateSelectorを使用しようとしていて、オンラインでいくつかの例を見てきました。シンプルだと思っていましたが、私はそれを働かせることはできません。拳はListBox ItemTemplateSelectorが機能しない

次のように、私は定義されたDataTemplateSelectorクラスを持っている:私は私が間違って行ってきたところ、誰かが私を伝えることができることを期待しています

Public Class DocketDataTemplateSelector 
    Inherits DataTemplateSelector 

    Public Overrides Function SelectTemplate(ByVal item As Object, ByVal container As DependencyObject) As DataTemplate 
     Return DataDocketHeaderTemplate 
    End Function 

    Private _DataDocketHeaderTemplate As DataTemplate 
    Public Property DataDocketHeaderTemplate() As DataTemplate 
     Get 
      Return _DataDocketHeaderTemplate 
     End Get 
     Set(ByVal value As DataTemplate) 
      _DataDocketHeaderTemplate = value 
     End Set 
    End Property 

    Private _DataDocketDataTemplate As DataTemplate 
    Public Property DataDocketDataTemplate() As DataTemplate 
     Get 
      Return _DataDocketDataTemplate 
     End Get 
     Set(ByVal value As DataTemplate) 
      _DataDocketDataTemplate = value 
     End Set 
    End Property 
End Class 

を非常に簡単 - ちょうどまで当分の間DataDocketHeaderTemplateのDataTemplateのを返します私はそれを働かせることができます。

<UserControl.Resources> 
    <DataTemplate x:Key="docketHeaderTemplate"> 
     <TextBlock Text="Header Row Test" Background="Yellow"/> 
    </DataTemplate> 

    <DataTemplate x:Key="docketDataTemplate"> 
     <TextBlock Text="Data Row Test" Background="Green"/> 
    </DataTemplate> 

    <local:DocketDataTemplateSelector DataDocketHeaderTemplate="{StaticResource docketHeaderTemplate}" DataDocketDataTemplate="{StaticResource docketDataTemplate}" x:Key="myDataTemplateSelector"/> 
</UserControl.Resources> 

は、ユーザーコントロールのリストボックスは、単にこのように定義されています:最終的にはその後

<ListBox ItemsSource="{Binding TestData}" ItemTemplateSelector="{StaticResource myDataTemplateSelector}"/> 

、私のTESTDATAリスト

は、私は、そのリソースの定義として、次のと私のユーザーコントロールを持っています私の拘束されたビューモデルでは以下のように定義されています:

Private _listTestData As ObservableCollection(Of String) = Nothing 
    Public Property TestData As ObservableCollection(Of String) 
     Get 
      If _listTestData Is Nothing Then 
       _listTestData = New ObservableCollection(Of String) 
       _listTestData.Add("Row 1") 
       _listTestData.Add("Row 2") 
       _listTestData.Add("Row 3") 
      End If 
      Return _listTestData 
     End Get 
     Set(ByVal value As ObservableCollection(Of String)) 
      _listTestData = value 
      NotifyPropertyChanged("TestData") 
     End Set 
    End Property 

今、私は私のリストボックス内の3行のリストはすべて、 'Header Row Test'と言っています(私のdatatemplateselectorは常にDataDocketHeaderTemplateを返しています)。しかし、その代わりに、私はこれは私がDocketDataTemplateSelectorにブレークポイントを設定して実際にあれば(私のオーバーライドdatatemplateselectorがヒットされていないことを示していると思われる 行1 行2 行の私のコアデータ3

を参照して、時間がない時に私はそれを見ていますヒットする)。私はどこでこれに間違っていますか?私はコメントとしてこれを投稿することができない

おかげ

答えて

1

申し訳ありませんが、私は十分なスコアを持っていません。

私はちょうどあなたのサンプルコード(私の最初のVBプロジェクト)を試して、それが期待どおりに動作するかを推測します:イエローの背景に3回の "ヘッダ行テスト"。 ListBoxをUserControlのGridに配置し、UserControlをGridのウィンドウに配置し、UserControlのDataContextをTestDataプロパティのViewModelオブジェクトに設定します。

あなたのサンプルコードでは説明されていない何かが間違っていなければなりません。

+0

これは興味深いです。私のエラーは明らかに他の場所です。私は掘り続けます。あなたのご意見ありがとうございます。 – Gatmando

+0

最後に、この問題は、プロジェクトのすべてのリストボックスに影響を与えていた特殊なListBoxスタイルに関連しています。 Clemens私は解決策に導いてくれたので、答えとしてあなたの回答をマークしています。どうもありがとう。 – Gatmando

関連する問題