Я работаю над проектом, который является надстройкой к программе 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 не обновляется?Это как-то ссылается на другой параметр / свойство?Я попытался пройти через процесс отладки, но я новичок в программировании и с трудом отслеживаю, что происходит не так.