面白い質問です!あなたが言ったように、1つの方法はItemsSourceコレクションをモックすることです。そのような:
<ListBox.ItemsSource>
<MultiBinding Converter="{StaticResource mockConverter}">
<Binding Path="YourCustomList" />
</MultiBinding>
</ListBox.ItemsSource>
バインディングが1つだけのマルチバインディングを使用したことに注意してください。コンバーターを「再実行」するには、これが正しい方法だと思います。このように、「YourCustomList」の項目を変更すると、コンバーターが再トリガーされます。
これとは異なり、コンバーターは1回だけトリガーされます(ItemsSourceが最初にバインドされたとき)
<ListBox ItemsSource="{Binding YourCUstomList, Converter={StaticResource mockCOnverter}}" />
^新しいアイテムを追加すると機能しません(YourCustomListプロパティが変更された場合にのみコンバーターが再実行されます)
MockConverterは簡単です。必ず、セパレータを使用してリストを生成してください。セパレーターには新しいクラスが必要です。このようにして、DataTemplates(DataType)を簡単に使用できます。次に、object=SeperatorのときにIsEnabled=falseを設定するには、ItemContainerStyleで新しいトリガーを設定する必要があります。
比較的痛みはなく、合併症は見られません。セパレータはListBoxItemsであってはならないので、少し醜いです。
おそらくこれもうまくいくでしょう。
ListBoxItemsPanelTemplateを独自のものでオーバーライドできます。独自のテンプレートで、好きなことを行うことができます。おそらくセパレーターを追加します。このように、ItemsSourceに触れることはありません。
コードについてはStackPanel.csをチェックしてください。現在、コードを提供することはできませんが、アイデアはこれです。StackPanelから継承し、Measure()とArrange()を上書きします。これらの関数を使用すると、stackPanelの大きさを計算し、セパレーターを描画する場所(X、y)を指定できます。セパレータはStackPanelの子である必要があり、IsHitTestVisible = Falseである必要があることに注意してください(イベントを生成しないようにするため)。
後のソリューションには時間がかかりますが、WPFを学習している場合は、どうしてですか?