Привет,
генерация моей коллекции Point3DCollection работает нормально, и я получаю сетку в Viewport3D (https://imgur.com/5Hzitw2),, но CalculateNoise () не обновляет мои связанные позициив Viewport3D, хотя метод OnPropertyChanged в моем ViewModel get вызывается. Что я здесь не так делаю?
Заранее спасибо, KonstIT
XAML:
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera x:Name="camera"/>
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<DirectionalLight Color="White" Direction="-1, -1, -3" />
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="{Binding Positions}" TriangleIndices="{Binding TriangleIndices}"/>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial Brush="White"/>
</GeometryModel3D.Material>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
ViewportViewModel:
internal class ViewportViewModel : INotifyPropertyChanged
{
private int _terrainSize;
private Point3DCollection _positions;
private Int32Collection _triangleIndices;
private Random random = new Random();
public Point3DCollection Positions
{
get
{
return _positions;
}
set
{
_positions = value;
OnPropertyChanged("Positions");
}
}
public Int32Collection TriangleIndices
{
get
{
return _triangleIndices;
}
set
{
_triangleIndices = value;
OnPropertyChanged("TriangleIndices");
}
}
public ViewportViewModel()
{
_terrainSize = 56;
_positions = new Point3DCollection();
_triangleIndices = new Int32Collection();
GeneratePositions();
GenerateTriangleIndices();
CalculateNoiseCommand = new CalculateNoiseCommand(this);
}
private void GeneratePositions()
{ //Works }
private void GenerateTriangleIndices()
{ //Works }
//Handling
...
internal void CalculateNoise()
{
for (int i = 0; i < _terrainSize * _terrainSize; i++)
{
Point3D point = new Point3D();
point = Positions[i];
point.Y = random.Next(10) / 10.0;
Positions[i] = point;
}
OnPropertyChanged("Positions");
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
Console.WriteLine("ViewportViewModel: " + propertyName);
}
}
#endregion
}
Код для замены текущей коллекции Point3DCol. Он такой же, как и GeneratePositions (), который вызывается в конструкторе, только с методом Positions.Clear () в начале. Он вызывается черезCalculateNoise ().
private void ReplacePositions()
{
if(Positions.Count > 0)
{
Positions.Clear();
}
var column = 0;
var row = 0;
Point3D point = new Point3D();
for (int i = 0; i < _terrainSize * _terrainSize; i++)
{
for (int j = 0; j < 3; j++)
{
if (j == 0)
point.X = ((float)column / ((float)_terrainSize - 1) - 0.5) * 2;
if (j == 1)
point.Y = 0;
if (j == 2)
point.Z = ((float)row / ((float)_terrainSize - 1) - 0.5) * 2;
}
Positions.Add(point);
// Calculate next row & column
column++;
if (column % _terrainSize == 0)
{
row++;
}
column %= _terrainSize;
}
}
internal void CalculateNoise()
{
ReplacePositions();
OnPropertyChanged("Positions");
}