0

ListBox の項目数に基づいて、ListBox の DataTemplate を変更する必要があります。次の XAML を思いつきました。

<Window.Resources>
  <DataTemplate x:Key="DefaultTemplate">
    <StackPanel Orientation="Horizontal">
   <TextBlock Text="{Binding Path=Text}"/>
   <TextBlock Text="default template" />
    </StackPanel>
  </DataTemplate>
  <DataTemplate x:Key="OtherTemplate">
    <StackPanel Orientation="Horizontal">
   <TextBlock Text="{Binding Path=Text}"/>
   <TextBlock Text="other template" />
    </StackPanel>
  </DataTemplate>      
</Window.Resources>
<ListBox Name="listBox1" ItemsSource="{Binding Path=Items}">
  <ListBox.Style>
    <Style TargetType="{x:Type ListBox}">
      <Setter Property="ItemTemplate" Value="{StaticResource DefaultTemplate}" />
        <Style.Triggers>
          <DataTrigger Binding="{Binding Path=Items.Count}" Value="1">
             <Setter Property="ItemTemplate" Value="{StaticResource OtherTemplate}"/>
          </DataTrigger>
        </Style.Triggers>
     </Style>
  </ListBox.Style>     
</ListBox>

上記の XAML では、バインドされたリストに 2 つ以上の項目を追加すると、データ テンプレートが期待どおりに (その他から既定に) 変更されました。ただし、2 つ以上のアイテムを含むリストの最初のアイテムを削除すると、リスト ボックス全体が空になります (バインドされたリストが空でないことを確認しました)。ただし、2 項目リストの 2 番目の項目を削除しても問題なく動作します (つまり、テンプレートがデフォルトからその他に変更されました)。

なぜこれが起こっているのですか?それとも、この問題を解決するために間違った方法をとったのでしょうか?

4

2 に答える 2

2

正確な問題や原因について話すことはできませんが、カウントが1で1のみの場合にDataTriggerがテンプレートを設定しているためです。

この問題を解決するために3つのことのうちの1つを行うことができますが、私がお勧めするのは1つだけです。

a) System.Windows.TriggerBaseから派生して、独自のDataTriggerを実装します

b)ItemsControl.Items.CountからDataTemplateに変換するSystem.Windows.Data.IValueConverterの実装を使用します。リソースのスコープにBinding.ConverterParameterとして要素を配置し、それらをFrameWorkElementにキャストして、FrameWorkElement.FindResource()を呼び出すことにより、テンプレートを取得します。

C)これは私の推奨事項です。独自のDataTemplateSelectorを作成して、うなり声を上げてください。このメカニズムは、特にあなたが達成する機能を対象としています。私は最近、x:Keyが設定されていないDataTemplateを必要とせずに、ソースオブジェクトのタイプに基づいてDataTemplateを選択するものを作成しました。テンプレートセレクターのプロパティを使用すると、XAMLを使用してDataTemplatesをDataTemplateSelectorに渡し、そのFindResourceコードの「todo」リストを削除できます。

于 2011-01-18T11:18:21.380 に答える
2

データ トリガーを使用することも、データ トリガーを使用することもできDataTemplateSelector ます。アイテムコントロール(リストボックスも)に適用する際のMSDNは次のとおりです

于 2010-08-03T00:12:04.467 に答える