2011-09-15 8 views
1

テンプレートアイテム(DataTemplate)でListBoxを作成しています。このテンプレートの中では、バインドされたデータに応じてテンプレートの一部が表示される方法を変更する可能性があります。ここで私が書いたものだ:テンプレートDatatemplate

<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を交換可能なグリッドの要素で書き込むにはどうすればよいですか?あなたにアドバイスをありがとう。

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

参照されるリソースは、このようなものです:

を:リストボックスが結合するのDataContextの

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

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

インデックスのプロパティ

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"です。

ラベルの異なる綴りに注意してください。 "ラベル"と "レブル"

関連する問題