Привязка данных вложенного списка объектов в WPF - PullRequest
0 голосов
/ 21 мая 2019

Я работаю над проектом, который является надстройкой к программе Revite от Autodesk, и у меня возникают проблемы с тем, чтобы все привязки данных работали в аде ViewModel, который я создал.У меня есть несколько классов типов элементов, которые имеют несколько свойств и список параметров.Параметры взяты из класса параметров, который имеет имя, значение и логическое значение для параметра IsReadOnly.В моей форме WPF у меня есть ListBox для выбора элемента и DataGrid для отображения параметров для редактирования.В MainViewModel я выполняю ICommand для создания Zone из элемента Revit, а затем создаю ZoneViewModel для зоны и добавляю ее в наблюдаемую коллекцию под названием Zones.

Я создал ViewModel для каждого типа элементаи универсальный ParameterViewModel, который будет использоваться для параметров.Ниже приведен пример для элемента Zone.

ZoneViewModel:

    public class ZoneViewModel : ViewModelBase
    {
        private Element _element;
        private EngineZone _zone;

        public EngineZone EZone;
        private ObservableCollection<ParameterViewModel> _parameters = new ObservableCollection<ParameterViewModel>();
        public ObservableCollection<ParameterViewModel> Parameters
        {
            get => _parameters;
            set => _parameters = value;
        }

        private string _elementId;
        public string ElementId
        {
            get => _elementId = EZone.ElementId;
            set => _elementId = EZone.ElementId;
        }

        private EngineParameter _name;
        public EngineParameter Name
        {
            get => _name = EZone.Name;
            set
            {
                _name = EZone.Name;
                RaiseProperty(nameof(Name));
            }
        }

        public EngineParameter Area
        {
            get => EZone.Area;
        }

        #region Default Constructor

        public ZoneViewModel(EngineZone zone)
        {
            EZone = zone;
            ElementId = zone.ElementId;

            Parameters.Add(new ParameterViewModel(EZone.Name, false));
            Parameters.Add(new ParameterViewModel(EZone.Area, true));
        }

        #endregion

ParameterViewModel:

    public class ParameterViewModel : ViewModelBase
{
    private EngineParameter _parameter;
    private bool _isReadOnly;
    public bool IsReadOnly
    {
        get => _isReadOnly;
        set => _isReadOnly = value;
    }

    public string Name
    {
        get => _parameter.Name;
    }

    public object Value
    {
        get => _parameter.Value;
        set
        {
            if (!_isReadOnly)
            {
                _parameter.Value = value;
                RaiseProperty(nameof(Value));
            }
        }
    }

    public ParameterViewModel(EngineParameter parameter, bool isReadOnly)
    {
        _parameter = parameter;
        _isReadOnly = isReadOnly;
    }
}

Проблема, с которой я сталкиваюсь, заключается в изменениизначение параметра в моей DataGrid не обновляет свойство в ZoneViewModel.

До - все отлично работает при первоначальном добавлении зон в коллекцию.

После - После изменения имени элемент зоны отражает изменение, но значение в ListBox не обновляется.

Код XAML для сетки данных и поля приведен ниже.

            <!--Column 1-->

            <TextBlock Grid.Column="0" Grid.Row="0"
                       Text="Zones" VerticalAlignment="Bottom" FontSize="16" />
            <ListBox Grid.Column="0" Grid.Row="1"
                     ItemsSource="{Binding Zones}" SelectedItem="{Binding SelectedItem}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Zone "/>
                            <TextBlock Text="{Binding Path=Name.Value}"/>
                            <TextBlock Text=" : "/>
                            <TextBlock Text="{Binding Path=ElementId}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

            <!--Column 2-->

            <TextBlock Grid.Column="2" Grid.Row="0"
                       Text="Info" VerticalAlignment="Bottom" FontSize="16" />

            <DataGrid Grid.Column="2" Grid.Row="1" Background="White" HeadersVisibility="None"
                      ItemsSource="{Binding SelectedItem.Parameters}" AutoGenerateColumns="False">
                <DataGrid.Resources>
                    <Style TargetType="{x:Type DataGridRow}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsReadOnly}"
                                         Value="True">
                                <Setter Property="IsEnabled"
                                        Value="False"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path = Name}" IsReadOnly="True" Width="*"/>
                    <DataGridTextColumn Binding="{Binding Path = Value}" Width="*"/>
                </DataGrid.Columns>
            </DataGrid>

Мой вопрос: почему значение ListBox не обновляется?Это как-то ссылается на другой параметр / свойство?Я попытался пройти через процесс отладки, но я новичок в программировании и с трудом отслеживаю, что происходит не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...