#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. Ты-спаситель! Большое спасибо, я не знал, что могу получить доступ к таким функциям