Как привязать объект зависимости внутри таблицы данных wpf к наблюдаемой коллекции

Фон: У меня есть пакет данных wpf с настраиваемым классом (CustomTextBox), который наследуется от TextBox. Я создал объект зависимости (ValueProperty) в этом настраиваемом классе, чтобы я мог к нему привязаться. У меня также есть наблюдаемая коллекция, которую я использую как DataSource для DataGrid.

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

Вот xaml для DataGridTemplateColumn, где происходит привязка:

<DataGridTemplateColumn Header = "Drawing Location"  Width = "240" CellStyle = "{StaticResource dataGridCellStyle}">
      <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <Label Content = "Drawing Location" Width = "230" HorizontalContentAlignment = "Center"/>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation = "Horizontal">
                <CustomTextBox:CustomTextBox x:Name = "ftbDrawingX" Value = "{Binding DrawingLocationX, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                             Style = "{StaticResource textBox}" Width = "85" Behavior = "DistanceCombinedFtIn"/>
                <Label Content = ","/>
                <CustomTextBox:CustomTextBox x:Name = "ftbDrawingY" Value = "{Binding DrawingLocationY, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                             Style = "{StaticResource textBox}" Width = "85" Behavior = "DistanceCombinedFtIn"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

А вот мое свойство зависимости в настраиваемом классе:

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(CustomTextBox), 
    new FrameworkPropertyMetadata(0D, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(ValueProperty_OnTextPropertyChanged)));

public double Value
{
    get {return (double)this.GetValue(ValueProperty);}    
    set
    {

    }
}

В коде позади:

private ObservableCollection<CustomItem> data = new ObservableCollection<CustomItem>();    
this.dgTakeoffDataGrid.ItemsSource = data;

Объект CustomItem реализует INotifyPropertyChanged и имеет два свойства: DrawingLocationX и DrawingLocationY.

Может ли кто-нибудь взглянуть и сказать мне, что я сделал не так. Мой DataGrid оказывается пустым, я знаю, что моя проблема связана с привязкой к объекту зависимости. Здесь приветствуется любая помощь.

Обновлено: Я удалил всю логику из свойства setter для Value и добавил метод обратного вызова, который обрабатывает изменения в объекте зависимости, а также обновляет его свойство Text.

private static void ValueProperty_OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs eventArgs)
    {
        CustomTextBox box = d as CustomTextBox;
        if (box != null)
        {
            box.value = Conversions.RoundLeastSignificant(Conversions.RoundLeastSignificant((double)eventArgs.NewValue));
            box.Text = Conversions.FormatReadTextValue((double)eventArgs.NewValue, box.behavior, box.acadDocument);
        }
    }

Где, по вашему мнению, будет отображаться свойство DrawingLocationX? В текстовом поле? Как определяется ваш стиль "textBox"?

mm8 13.09.2018 17:14

@ mm8 Я ожидаю, что DrawingLocationX и DrawingLocationY будут отображаться в элементах управления CustomTextBox. Если вы посмотрите в Xaml, я привязан к этим двум. Стиль просто устанавливает размер, цвет фона и текст-заполнитель.

Divine Coder 13.09.2018 17:29

Так почему вы ожидаете, что TextBox сможет отображать значение вашего настраиваемого свойства ...? Где вы устанавливаете свойство Text?

mm8 13.09.2018 17:33

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

Divine Coder 13.09.2018 17:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
249
1

Ответы 1

Мне удалось решить эту проблему. Решение в моем последнем комментарии: Решение состоит в том, чтобы удалить всю логику из установщика свойства и обработать значение Value в методе CallBack, определяемом при регистрации свойства зависимости.

Это общее решение. Надеюсь, это поможет и другим.

Другие вопросы по теме