Настройка привязки данных WPF: как добавить пользовательскую логику? - PullRequest
1 голос
/ 29 апреля 2010

У меня есть вопрос относительно сложной привязки данных.
Я хочу иметь возможность обновить сетку (для свойства IsItemsHost установлено значение true)
динамически всякий раз, когда происходит привязка данных.
На самом деле я использую CustomControl, который является ItemsControl, и это
имеет сетку в свой ControlTemplate.

Чтобы быть более точным, я привязываю сетку к некоторым элементам и хочу изменить количество строк сетки в зависимости от этих элементов, добавить что-то вроде заголовка (одна строка, содержащая текст), и установите элементы 'Grid.Row и Grid.Column с использованием некоторой пользовательской логики.

Какой самый простой способ применить такое поведение? когда связанные данные обновляются?

Должен ли я использовать модель представления, которая также содержит данные заголовка?

Заранее спасибо.

Код пользовательского элемента управления Generic.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TimeTableControl">
<Style TargetType="{x:Type local:TimeTableControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:TimeTableControl}">
                <Border Width="Auto" Height="Auto" BorderBrush="#FF4B5A9B" BorderThickness="4" CornerRadius="4" Margin="2" Padding="0" Background="White">
                    <Grid Width="Auto">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="0.1*"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Viewbox>
                            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DayCaption}"/>
                        </Viewbox>
                        <Border Grid.Row="1" BorderThickness="0,2,0,0" BorderBrush="#FF4B5A9B">
                            <Grid Name="ContentGrid" IsItemsHost="True">
                            </Grid>
                        </Border>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</ResourceDictionary>

Ответы [ 2 ]

0 голосов
/ 05 июня 2010

Обновление: я заработал, создав собственную панель, которая использует MeasureOverride и ArrangeOverride для обновления. Это позволяет мне настроить панель под детей, и мне даже не нужно использовать сетку. Это также делает управление не выглядящим.

0 голосов
/ 29 апреля 2010

Grid используется для макета. Если у вас есть изменяющееся количество предметов в какой-либо коллекции, то вам действительно нужно ItemsControl или более конкретно ListBox (если вы хотите выбрать предмет и т. Д.).

Если вы все еще хотите Grid -подобное поведение отдельных строк, вы можете определить Grid в ItemsControl.ItemTemplate и поиграть с Grid.IsSharedSizeScope на уровне ItemsControl. В качестве альтернативы вы можете просто использовать ListView вместо этого, чтобы получить вид сетки и выбор элементов в пакете.

...