[WPF] Конфигурирование внешнего вида элемента извне
От: WSN Россия  
Дата: 15.10.10 10:08
Оценка:
Друзья!

Долго не мог придумать тему топа, собственно как и не понимаю особо что гуглить.
Попробую донести суть задачи.

Есть приложение, у него Main Window, в котором располагаются всякие мои контролы.
Есть у меня такой контрол, который содержит в себе ListBox (который настраивается определенными шаблонами)
Каждый item'a в листбоксе состоит из 2х частей (основное содержимое и настраиваемое извне (из основного окна, например)




Когда item селектится, у него появляется дополнительное содержимое (чтобы там все красиво выдвигалось и т.д. я сделал).
И думал, что настроить то, что там будет показываться будет предельно просто, примерно так:

XAML Шаблон для айтема:
<UserControl x:Class="OFTD.Controls.WPF.Common.PagesListBoxControl"
    xmlns:src="clr-namespace:OFTD.Controls.WPF.Common"
    x:Name="MainControl">

            ...

                    <ContentControl DockPanel.Dock="Bottom" x:Name="ExtendedContent" Visibility="Visible"  Opacity="0" >
                        <FrameworkElement.LayoutTransform>
                            <ScaleTransform ScaleX="1" ScaleY="0"/>
                        </FrameworkElement.LayoutTransform>
                        <ContentControl.Style>
                            <Binding Source="MainControl" Mode="OneWay" Path="src:PagesListBoxControl.ExtendedContentStyle">
                                
                            </Binding>
                        </ContentControl.Style>
...


Создал в своем контроле PagesListBoxControl зависимое свойство

public static readonly DependencyProperty ExtendedContentStyleProperty = DependencyProperty.Register
            (
            "ExtendedContentStyle"
            , typeof(Style)
            , typeof(PagesListBoxControl)
            , new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange)
            
            );
public Style ExtendedContentStyle
        {
            get { return (Style) GetValue(ExtendedContentStyleProperty); }
            set { SetValue(ExtendedContentStyleProperty, value); }
        }


ну и из основного окна создаю сам контрол (XAML):


                         <cwpfc:PagesListBoxControl Width="Auto" Height="Auto" Name="_fragmentsVertical">
                                <cwpfc:PagesListBoxControl.ExtendedContentStyle>
                                    <Style>
                                        <Setter Property="ContentControl.ContentTemplate">
                                            <Setter.Value>
                                                <DataTemplate DataType="{x:Type s:String}">
                                                    <StackPanel Orientation="Horizontal">
                                                        <Button Content="{Binding}"></Button>
                                                        <Button>111</Button>
                                                        <Button>222</Button>
                                                    </StackPanel>
                                                </DataTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </cwpfc:PagesListBoxControl.ExtendedContentStyle>


Для каждого айтема будет определенные данные, эту проблему решил с помощью IValueConverter'a

Но вот не получается заставить расширенное моё содержимое рисовать мои кнопочки.

Да даже не в этом вопрос собственно.

Как бы вы сделали, если бы стояла задача:
ЛистБокс с айтемами, у которые есть определенные шаблон внутри самой реализации листбокса, а также есть какое-то расширяемое содержимое, которое биндится к определенным данным для каждого айтема и внешний вид которого (добавлять кнопки с командами, всякие тексты и т.д) можно бы было конфигурировать извне?

С нетерпением жду ответов!

С уважением, Иван
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.