WPF элемент по умолчанию
От: carpenter СССР  
Дата: 14.07.12 15:25
Оценка:
Допустим есть некий 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 тогда дефолтный элемент будет показан.

Можно ли вообще реализовать то что я хочу?
Re: WPF элемент по умолчанию
От: vit_as Россия  
Дата: 14.07.12 16:02
Оценка:
Здравствуйте, 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.
Re: WPF элемент по умолчанию
От: MxMsk Португалия  
Дата: 14.07.12 19:48
Оценка: 2 (1)
Здравствуйте, carpenter, Вы писали:

C>В таком виде у меня не показывается элемент по умолчанию,

C>если я уберу определение ItemTemplate тогда дефолтный элемент будет показан.
Здесь надо понимать, что такое шаблон. По сути, шаблоны в WPF — это строители визульного дерева содержимого. Когда ты вписываешь элемент напрямую в ListBox, ты задаешь содержимое, но, так как указан еще и шаблон, визуальное дерево для этого содержимого становится совершенно другим. Увидеть это проще простого, если взять, да и добавить стандартный ContentPresenter:
<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <TextBlock />
            <ContentPresenter Content="{TemplateBinding Content}"/>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

Теперь мы можем увидеть и DockPanel и TextBox и кнопку, потому что мы указали при помощи ContentPresenter, где их нужно размещать в визуальном дереве.

C>Можно ли вообще реализовать то что я хочу?

Можно, конечно. Вариантов несколько:
  1. ItemTemplateSelector, если по значению элемента в ListBox можно узнать, что он первый.
  2. Шаблон со специфичным DataType, если по типу элемента в ListBox можно узнать, что он первый.
  3. Назначать шаблон через конвертер, который смог бы учитывать позицию элемента в списке. Но здесь придется повозиться с AlternationCount и AlternationIndex.
Во всех случаях лучше сделать два разных шаблона. Я бы не рекомендовал смешивать задание визуальщины одновременно и через содержимое и через шаблон. Как ни пафосно, это мусорит сознание, учит кривому подходу.
Re: WPF элемент по умолчанию
От: fisherman Беларусь  
Дата: 17.07.12 15:52
Оценка: 2 (1) +1
Здравствуйте, 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 и забиндиться на неё?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.