Фон:
У меня есть пакет данных wpf с настраиваемым классом (CustomTextBox
), который наследуется от TextBox
. Я создал объект зависимости (ValueProperty
) в этом настраиваемом классе, чтобы я мог к нему привязаться. У меня также есть наблюдаемая коллекция, которую я использую как DataSource
для DataGrid
.
Проблема:
Проблема в том, что когда я привязываю свойство зависимости своего настраиваемого класса к общедоступному свойству в наблюдаемой коллекции, в DataGrid
ничего не отображается.
Вот xaml для DataGrid
TemplateColumn
, где происходит привязка:
<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);
}
}
@ mm8 Я ожидаю, что DrawingLocationX и DrawingLocationY будут отображаться в элементах управления CustomTextBox. Если вы посмотрите в Xaml, я привязан к этим двум. Стиль просто устанавливает размер, цвет фона и текст-заполнитель.
Так почему вы ожидаете, что TextBox сможет отображать значение вашего настраиваемого свойства ...? Где вы устанавливаете свойство Text?
Я внес некоторые изменения в код, смотрите правки. Теперь я могу отображать значения, но отображаются не все, что довольно странно.
Мне удалось решить эту проблему. Решение в моем последнем комментарии: Решение состоит в том, чтобы удалить всю логику из установщика свойства и обработать значение Value в методе CallBack, определяемом при регистрации свойства зависимости.
Это общее решение. Надеюсь, это поможет и другим.
Где, по вашему мнению, будет отображаться свойство DrawingLocationX? В текстовом поле? Как определяется ваш стиль "textBox"?