У меня есть сетка данных, которую я хотел бы, чтобы при изменении значений в любой ячейке в графическом интерфейсе обновлялись другие свойства модели представления.
Я видел это , но мне интересно,может быть сделано путем привязки события, такого как SourceUpdated
или CurrentCellChanged
, например:
(просмотр)
<DataGrid ItemsSource="{Binding Terrain, Mode=TwoWay, NotifyOnSourceUpdated=True}"
Grid.Column="0" Grid.Row="15" Grid.ColumnSpan="1"
AutoGenerateColumns="True"
CanUserAddRows="True"
CanUserDeleteRows="True"
SourceUpdated="{Binding TerrainChangedEvent }" Margin="0,6,0,20" Grid.RowSpan="2"/>
и в модели представления
public EventHandler<EventArgs> TerrainChangedEvent;
public ObservableCollection<TerrainSpec> Terrain
{
get { return _terrain; }
set { _terrain = value; ReCalcOtherProperty(); RaisePropertyChanged(nameof(Terrain));
}
public TerrainViewModel()
{
Terrain = new ObservableCollection<TerrainSpec>()
TerrainChangedEvent += RaiseTerrainChanged;
}
private void RaiseTerrainChanged(object sender, EventArgs e)
{
ReCalcOtherProperty();
RaisePropertyChanged(nameof(Terrain));
}
и модель
public class TerrainSpec : INotifyPropertyChanged
{
private double _height;
private double _distance;
public double Distance
{
get { return _distance; }
set { _distance = value; RaisePropertyChanged(nameof(Distance)); }
}
public double Height
{
get { return _height; }
set { _height = value; RaisePropertyChanged(nameof(Height)); }
}
public override string ToString()
{
return $"{Distance:F2} m, {Height:F2} m";
}
#region PropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
Однако при попытке запуска выдается ошибка:
InvalidCastException: невозможно преобразовать объект типа 'System.Reflection.RuntimeEventInfo'набрать 'System.Reflection.MethodInfo'
Есть ли способ сделать это?