Очистите 3D-представление WPF-Helix toolkit с помощью кнопок

#c# #wpf #helix-3d-toolkit

Вопрос:

Я использую WPF с набором инструментов Helix для анимации 3D-сеток. У меня есть данные в виде точек, и я создаю окончательную сетку с этими данными. Я взял из примеров Helix проект SimpleDemo, и в моем файле MainViewModel.cs у меня есть этот код:

 public class MainViewModel : INotifyPropertyChanged  {  MeshBuilder meshBuilder;  MeshGeometry3D mesh;  Model3DGroup modelGroup;   public MainViewModel()  {  var greenMaterial = MaterialHelper.CreateMaterial(Colors.Green);   modelGroup = new Model3DGroup();   // Create a mesh builder and add a box to it  meshBuilder = new MeshBuilder(false, false);  meshBuilder.AddBox(new Point3D(1, 1, 1), 1, 1, 1);   // Create a mesh from the builder (and freeze it)  mesh = meshBuilder.ToMesh(true);    modelGroup.Children.Add(new GeometryModel3D { Geometry = mesh, Material = greenMaterial, BackMaterial = greenMaterial });   Model = modelGroup;  ButtonClearAsync();  } ... rest code ...  

здесь я создаю один куб, а затем добавляю его в модель. Метод ButtonClearAsync-это метод, который очищает модель.

 public async Task RemoveModel()  {   modelGroup = new Model3DGroup();  await Task.Delay(2000);  Model = null;   OnPropertyChanged(nameof(Model));   meshBuilder = new MeshBuilder(false, false);  meshBuilder.AddBox(new Point3D(5, 5, 5), 2, 2, 2);   mesh = meshBuilder.ToMesh(true);   var greenMaterial = MaterialHelper.CreateMaterial(Colors.Green);   modelGroup.Children.Add(new GeometryModel3D { Geometry = mesh, Material = greenMaterial, BackMaterial = greenMaterial });   Model = modelGroup;  OnPropertyChanged(nameof(Model));  }  

Он ждет 2 секунды, очищает модели и повторно рисует текущую модель с другим объектом. Обработчик событий отлично работает.

проблема в том, что мне нужно очищать и перерисовывать модель всякий раз, когда нажимается кнопка. Но в файлах MainWindow.xaml и MainWindow.xaml.cs для вызова функции внутри MainViewModel я должен создать объект класса. Но если я это сделаю, я думаю, что из-за конструктора MainViewModel будет создан другой экземпляр модели, и модель никогда не будет ясной или измененной вообще.

Он никогда не очищается, потому что обработчик события всегда возвращает значение null и ничего не делается. Это работает только в том случае, если я запускаю метод Clear в конструкторе MainViewModel, но это не то, что я хочу.

Есть какие-нибудь предложения о том, что мне делать? Заранее спасибо

Ответ №1:

Если вам нужно вызвать метод в модели представления, попробуйте:

 if(this.DataContext is MainViewModel mvm){  mvm.MyFunctionToCall(); }  

при этом используется текущий текст данных главного окна, поэтому вам не нужно создавать какой-либо новый объект MainViewModel.

Комментарии:

1. Ты-спаситель! Большое спасибо, я не знал, что могу получить доступ к таким функциям