У меня есть DataGrid, который должен быть заполнен пользователем, XAML:
<DataGrid ItemsSource="{Binding Path=Input.InloopAangepast, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=TypeOppervlak}"/>
<DataGridTextColumn Binding="{Binding Path=TypeAfstroming}"/>
<DataGridTextColumn Binding="{Binding Path=Parameters[0].Double}"/>
<DataGridTextColumn Binding="{Binding Path=Parameters[1].Double}"/>
<DataGridTextColumn Binding="{Binding Path=Parameters[2].Double}"/>
<DataGridTextColumn Binding="{Binding Path=Parameters[3].Double}"/>
<DataGridTextColumn Binding="{Binding Path=Parameters[4].Double}"/>
<DataGridTextColumn Binding="{Binding Path=Parameters[5].Double}"/>
<DataGridTextColumn Binding="{Binding Path=Parameters[6].Double}"/>
</DataGrid.Columns>
</DataGrid>
ViewModel:
InloopAangepast = new ObservableCollection<Inloop>();
А также:
public class Inloop : INotifyPropertyChanged
{
public Inloop()
{
Parameters = new ObservableCollection<InloopParameter>();
}
private string _typeOppervlak;
private string _typeAfstroming;
private string _omschrijving;
public ObservableCollection<InloopParameter> _parameters;
public string TypeOppervlak
{
get
{
return _typeOppervlak;
}
set
{
_typeOppervlak = value;
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("TypeOppervlak"));
}
}
}
public string TypeAfstroming
{
get
{
return _typeAfstroming;
}
set
{
_typeAfstroming = value;
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("TypeAfstroming"));
}
}
}
public string Omschrijving
{
get
{
return _omschrijving;
}
set
{
_omschrijving = value;
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("Omschrijving"));
}
}
}
public ObservableCollection<InloopParameter> Parameters
{
get
{
return _parameters;
}
set
{
_parameters = value;
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("Parameters"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class InloopParameter : INotifyPropertyChanged
{
public InloopParameter()
{
}
private string _naam;
private string _string;
private double? _double;
public string Naam
{
get
{
return _naam;
}
set
{
_naam = value;
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("Naam"));
}
}
}
public string String
{
get
{
return _string;
}
set
{
_string = value;
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("String"));
}
}
}
public double? Double
{
get
{
return _double;
}
set
{
_double = value;
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("Double"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Я могу ввести первые два поля (TypeOppervlak и TypeAfstroming) в порядке, но когда я вхожу в одно из других полей, я получаю сообщение об ошибке "Двухсторонняя привязка требует Path или XPath". Что я делаю не так?
Вам необходимо инициализировать _parameters
чтобы пользователь мог их редактировать. Инициализировать его в конструкторе:
public Inloop()
{
_parameters = new ObservableCollection<InloopParameter>();
_parameters.Add(new InloopParameter());
_parameters.Add(new InloopParameter());
_parameters.Add(new InloopParameter());
_parameters.Add(new InloopParameter());
_parameters.Add(new InloopParameter());
_parameters.Add(new InloopParameter());
_parameters.Add(new InloopParameter());
}
Вам нужно добавить элементы в список, равный индексу, который вы связываете с пользовательским интерфейсом (точнее, 7 элементов).
Свойство Parameters
равно null. Обязательно назначьте коллекцию свойству в конструкторе.