2011-09-15 114 views
1

我使用模板化項目(DataTemplate)創建了一個ListBox。在這個模板中,我希望能夠根據綁定的數據改變模板部分的顯示方式。這是我寫的:模板數據模板

<ListBox Grid.Row="1" 
     ItemsSource="{Binding Indices}" 
     HorizontalContentAlignment="Stretch"> 
     <DataTemplate> 
      <Grid Margin="3"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="4*"/> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 

       <!-- ****this does not work ;(**** --> 
       <ContentPresenter Grid.Column="0" 
        Content="{Binding}"> 
        <ContentPresenter.ContentTemplateSelector> 
         <tmpl:BoolBasedSelector 
          Value="{Binding IsEditable, ElementName=MainCtrl}" 
          TrueTemplate="{StaticResource listBoxEditableLabel}" 
          FalseTemplate="{StaticResource listBoxNonEditableLabel}" /> 
        </ContentPresenter.ContentTemplateSelector> 
       </ContentPresenter> 

       <!-- other stuff, not important right now --> 
       <Button Grid.Column="1" /> 
       <Button Grid.Column="2" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox> 

MainCtrl是其內包含此列表中的網格被放置在主控件的名稱。 如何編寫ListBox的DataTamplate與可交換的網格元素?感謝您的建議。

編輯: TMPL:BoolBasedSelector是非常簡單的:

class BoolBasedSelector: DataTemplateSelector { 
    public bool Value { get; set; } 
    public DataTemplate TrueTemplate { get; set; } 
    public DataTemplate FalseTemplate { get; set; } 

    public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) { 
     return Value ? TrueTemplate : FalseTemplate; 
    } 
} 

引用的資源是這樣的:

<DataTemplate x:Key="listBoxEditableLable"> 
    <TextBox Text="{Binding Label}" /> 
</DataTemplate> 

<DataTemplate x:Key="listBoxNonEditableLable"> 
    <TextBlock Text="{Binding Label}" /> 
</DataTemplate> 

指數在DataContext的屬性,其中列表框結合:

interface IIndex { 
    string Label { get; set; } 
    IIndexValueProvider ValueProvider { get; set; } 
    IIndexValidator Validator { get; set; } 
    bool IsEditable { get; set; } 
    bool IsGrouped { get; set; } 
} 

回答

0

您的模板使用靜態資源名稱「listBoxEditableLable」和「listBoxNonEditableLabel」,但您的數據模板鍵是「listBoxEditableLable」和「listBoxNonEditableLable」。

請注意標籤的不同拼寫。 「標籤」與「標籤」