Здравствуйте, carpenter, Вы писали:
C>Допустим есть некий ListBox — я хочу добавить один элемент по дефолту,
C>а остальные забиндить
C>как пример
C>C><ListBox Grid.Row="0" Grid.Column="1" Margin="0,0,0,0" Name="DirList" >
C> <DockPanel>
C> <TextBox Name="Initial" Width="10" Height="132"/>
C> <Button Name="Navigate" Width="10" Height="132"/>
C> </DockPanel>
C> <ListBox.ItemTemplate>
C> <DataTemplate>
C> <StackPanel>
C> <TextBlock />
C> </StackPanel>
C> </DataTemplate>
C> </ListBox.ItemTemplate>
C> </ListBox>
C>
C>В таком виде у меня не показывается элемент по умолчанию,
C>если я уберу определение ItemTemplate тогда дефолтный элемент будет показан.
C>Можно ли вообще реализовать то что я хочу?
Может создать
CompositeCollection и забиндиться на неё?
Здравствуйте, carpenter, Вы писали:
C>В таком виде у меня не показывается элемент по умолчанию,
C>если я уберу определение ItemTemplate тогда дефолтный элемент будет показан.
Здесь надо понимать, что такое шаблон. По сути, шаблоны в WPF — это строители визульного дерева содержимого. Когда ты вписываешь элемент напрямую в ListBox, ты задаешь содержимое, но, так как указан еще и шаблон, визуальное дерево для этого содержимого становится совершенно другим. Увидеть это проще простого, если взять, да и добавить стандартный ContentPresenter:
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock />
<ContentPresenter Content="{TemplateBinding Content}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
Теперь мы можем увидеть и DockPanel и TextBox и кнопку, потому что мы указали при помощи ContentPresenter, где их нужно размещать в визуальном дереве.
C>Можно ли вообще реализовать то что я хочу?
Можно, конечно. Вариантов несколько:
ItemTemplateSelector, если по значению элемента в ListBox можно узнать, что он первый.
Шаблон со специфичным DataType, если по типу элемента в ListBox можно узнать, что он первый.
Назначать шаблон через конвертер, который смог бы учитывать позицию элемента в списке. Но здесь придется повозиться с AlternationCount и AlternationIndex.
Во всех случаях лучше сделать два разных шаблона. Я бы не рекомендовал смешивать задание визуальщины одновременно и через содержимое и через шаблон. Как ни пафосно, это мусорит сознание, учит кривому подходу.
Допустим есть некий ListBox — я хочу добавить один элемент по дефолту,
а остальные забиндить
как пример
<ListBox Grid.Row="0" Grid.Column="1" Margin="0,0,0,0" Name="DirList" >
<DockPanel>
<TextBox Name="Initial" Width="10" Height="132"/>
<Button Name="Navigate" Width="10" Height="132"/>
</DockPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
В таком виде у меня не показывается элемент по умолчанию,
если я уберу определение ItemTemplate тогда дефолтный элемент будет показан.
Можно ли вообще реализовать то что я хочу?
Здравствуйте, carpenter, Вы писали:
C>Допустим есть некий ListBox — я хочу добавить один элемент по дефолту,
C>а остальные забиндить
C>как пример
C>C><ListBox Grid.Row="0" Grid.Column="1" Margin="0,0,0,0" Name="DirList" >
C> <DockPanel>
C> <TextBox Name="Initial" Width="10" Height="132"/>
C> <Button Name="Navigate" Width="10" Height="132"/>
C> </DockPanel>
C> <ListBox.ItemTemplate>
C> <DataTemplate>
C> <StackPanel>
C> <TextBlock />
C> </StackPanel>
C> </DataTemplate>
C> </ListBox.ItemTemplate>
C> </ListBox>
C>
C>В таком виде у меня не показывается элемент по умолчанию,
C>если я уберу определение ItemTemplate тогда дефолтный элемент будет показан.
C>Можно ли вообще реализовать то что я хочу?
Можно, изменив
Template ListBox'a.