Не удается получить доступ к тексту ColumnHeader (шаблон) - PullRequest
0 голосов
/ 04 ноября 2011

С шаблоном DataGridColumnHeader я создал метку, которая должна показывать только числовое значение рядом с текстом заголовка, если мультисвязывание соответствует правилам.

Я успешно создал этот код в UserControl и он работает как положено.

Но теперь для элемента управления Windows это больше не работает, и я совершенно потерял дар речи, почему это так.

Строка <Binding Path="Text" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/> в Multibinding предназначена для привязки к свойству Text фактического заголовка. Но эта привязка, похоже, не работает.

Я получаю следующее сообщение об ошибке:

System.Windows.Data Предупреждение: 40: Ошибка пути BindingExpression: «Текст» свойство не найдено в 'object' '' iReportViewModel ' (HashCode = 36680867). BindingExpression: Path = Text; DataItem = 'iReportViewModel' (HashCode = 36680867); целевой элемент 'Label' (Name = 'ColumnHeaderSortingNumber'); целевое свойство «Содержимое» (тип «Объект»)

Но как это работает на моем другом пользовательском контроле с точной копией и вставленным кодом? Почему он смотрит на ViewModel? Я ожидал получить доступ к ViewModel, если он определен так: Path = "DataContext.Text", как вторая строка. Это должно было получить доступ к тексту (заголовку) в том же заголовке.

Любая идея помочь мне будет высоко оценена,

<Style x:Key="DatagridColumnHeaderCustomTemplateStyle" TargetType="{x:Type DataGridColumnHeader}">
                 ...
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    ...
                                </Grid.RowDefinitions>
                                <theme:DataGridHeaderBorder>
                                   ...
                                </theme:DataGridHeaderBorder>
                                <Label FontSize="8" FontWeight="Bold" Background="Transparent" Style="{StaticResource ColumnHeaderSortingLabel}" x:Name="ColumnHeaderSortingNumber" Panel.ZIndex="1000" Visibility="Collapsed" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" Margin="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
                                    <Label.Content>
                                        <MultiBinding Converter="{StaticResource ColumnHeaderDictionaryConv}" ConverterParameter="LookupSecond" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                                            <Binding Path="Text" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
                                            <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGridCellsPanel}}" Path="DataContext.SortCollectionHeader" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
                                            <Binding ... />
                                        </MultiBinding>
                                    </Label.Content>
                                </Label>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

1 Ответ

1 голос
/ 04 ноября 2011

Возможно, вы уже должны это знать, если в Binding не указан источник, он будет искать свойство, указанное в Path в DataContext. Источники: ElementName, Source & RelativeSource, поэтому вам нужно DataContext.X во второй привязке, так как в противном случае это будет искать свойство источника.

Если вы хотите привязать свойство к элементу управления, которому принадлежит привязанное свойство, добавьте RelativeSource="{RelativeSource Self}". Если вы хотите привязать свойство к шаблонному родителю, вы можете использовать TemplateBinding или также использовать RelativeSource с TemplatedParent вместо Self.

...