Rakon22 Ответов: 2

Привязка из заголовка к свойству зависимости


Привет
Я хотел бы изменить заголовки столбцов DataGrid на два текстовых поля. Я создал класс и собственность Depndency: свойства myproperty, но привязка не работает. Я пробовал разные комбинации, к сожалению, не знаю, где я делаю ошибку. Пожалуйста помочь

Что я уже пробовал:

Колонка:
<extensions:CustomDataGridTextColumn HeaderStyle="{StaticResource Nagłówek2tb}" Header="Nagłówek 1" MyProperty ="Nagłówek2"/>

Style:
<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="Nagłówek2tb">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate >
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <TextBlock Grid.Row="0" Text="{Binding}" TextWrapping="Wrap"/>
                            <TextBlock Grid.Row="1" Text="{Binding MyProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridTextColumn}}"/>
                        </Grid>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Класс

public class CustomDataGridTextColumn : System.Windows.Controls.DataGridTextColumn
    {
 
        public string MyProperty
        {
            get { return (string)GetValue(MyPropertyProperty); }
            set { SetValue(MyPropertyProperty, value); }
        }
 
        public static readonly DependencyProperty MyPropertyProperty =
          DependencyProperty.Register("MyProperty", typeof(string), typeof(CustomDataGridTextColumn), new UIPropertyMetadata(""));
 
    }

Graeme_Grant

какую ошибку выдает окно вывода отладки в VS?

Rakon22

Система.Окна.Ошибка данных: 4: не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType=' System.Окна.Управления.DataGridTextColumn', AncestorLevel= '1". BindingExpression:Path=MyProperty; DataItem=null; целевой элемент - 'TextBlock' (Name="); целевое свойство - 'Text' (type 'String')

Graeme_Grant

Я рассмотрел вторую проблему, но первая проблема, ошибка привязки, связана с:

TextBlock Grid.Row="1" Text="{Binding MyProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridTextColumn}}"/>

К чему ты пытаешься привязаться?

Rakon22

Я видел эту тему, но когда я использую DataGridTemplateColumn, то DataGrid занимает много места в оперативной памяти (200 строк 300 МБ оперативной памяти), поэтому я ищу другие решения

2 Ответов

Рейтинг:
2

Bernhard Hiller

DataGridColumnHeader это страшный зверь, он не является ни частью визуального дерева, ни логического дерева. Вам нужен BindingProxy, и много работы вокруг. См., например,
[WPF] Как привязаться к данным, если DataContext не наследуется » Томас levesque в .Чистый блог[^]


Рейтинг:
1

Graeme_Grant

Короткий ответ: {Binding} - это не ярлык для "привязки к себе" (в смысле RelativeSource.Self). Скорее, {Binding} эквивалентен {Binding Path=.}, который связывается с текущим источником.


Rakon22

Хорошо спасибо но я все еще не знаю как должен выглядеть код