Как связать объект зависимости внутри сетки данных wpf с наблюдаемой коллекцией - PullRequest
0 голосов
/ 13 сентября 2018

Справочная информация: У меня есть таблица данных 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);
        }
    }

1 Ответ

0 голосов
/ 13 сентября 2018

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

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

...