C # Как привязать WPF GeometryModel3D к ViewModel с помощью Caliburn.Micro

#c# #wpf #xaml #3d #caliburn.micro

#c# #wpf #xaml #3D #caliburn.micro

Вопрос:

Я пытаюсь привязать GeometryModel3D из моего XAML к свойству свойства в моей ViewModel в C #. Я использую Caliburn.Микро, чтобы установить мой MVVM. Ниже приведен упрощенный фрагмент того, как я пытаюсь привязать в моем представлении XAML:

 <Viewport3D>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <Model3DGroup>
                <GeometryModel3D x:Name = "CubeVisual_Cube">
            </Model3DGroup>
        </ModelVisual3D.Content>
    </ModelVisual3D>
</Viewport3D>
  

и в моей C # ViewModel:

 private CubeModel _cubeVisual = new CubeModel();
public CubeModel CubeVisual
{
    get { return _cubeVisual; }
    set
    {
        _cubeVisual = value;
        NotifyOfPropertyChange(() => CubeVisual);
    }
}
  

У CubeVisual есть конструктор, который полностью устанавливает геометрию и материал GeomretyModel3D. И, наконец, часть моего класса CubeModel, которая создает свойство GeometryModel3D:

 public class CubeModel
{
    private GeometryModel3D _cube;
    public GeometryModel3D Cube
    {
        get { return _cube; }
        set { _cube = value; }
    }
}
  

Когда я выполняю этот код, кажется, что куб неправильно привязывается к Geometry3D на мой взгляд. В моем свойстве CubeVisual нет точек останова. Не генерируется ошибок, которые помогли бы мне разобраться в этом. Есть идеи о том, что я делаю неправильно? Спасибо.

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

1. Можете ли вы сделать это, не Caliburn.Micro вставая на пути? Если вы не можете, попробуйте сначала ЭТО. Если есть какие-либо проблемы с привязкой, то окно вывода VS сообщит вам об этом.

2. Я рассматриваю возможность удаления моего MVVM, чтобы я мог выполнить привязку с помощью файла xaml.cs. В моей ситуации это может стоить того, поскольку я единственный разработчик, а это небольшой проект.

3. Вы можете и должны иметь MVVM без caliburn micro.

Ответ №1:

Viewport3D не поддерживает привязку данных, поэтому вы не сможете заставить это работать даже с обычным INPC, не говоря уже о Caliburn Micro. Это невероятно раздражает, если вы спросите меня, потому что нет веской причины, по которой это должно отличаться от того, что есть для 2D, т. Е. вы должны иметь возможность использовать Viewport3D в качестве панели ItemsControl, а затем использовать шаблоны данных для заполнения сцены графическими объектами на основе коллекции моделей просмотра сцены (если это не могло быть реализовано точно так, то должно было быть, по крайней мере, что-то подобное). Увы, ничего из этого не было включено в 3d-классы, поэтому мы остались с этой мешаниной полу-поддержки, где отдельные свойства 3d-объекта являются надлежащими свойствами зависимости с полной поддержкой привязки и т.д., Но само фактическое управление сценой — нет.

Итак, в принципе, если вы хотите этого, вы должны сделать это самостоятельно. Создайте пользовательский элемент управления со свойством зависимости «ItemsSource», а затем настройте уведомление об изменении коллекции, чтобы при изменении элементов в этом списке вы соответствующим образом обновляли свою сцену. Как вы сопоставляете модели просмотра с реальными объектами 3D-сцены, зависит от вас, одно из возможных решений — использовать view model в качестве ключа к 3D-объекту, который вы хотите, чтобы он представлял (стоит отметить, что на самом деле именно так работают DataTemplates в 2D случае …. <DataTemplate DataType="{x:Type viewModelType}> это просто синтаксический сахар для <DataTemplate x:Key="{x:Type viewModelType}> ).

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

1. Спасибо. Это имеет смысл. Определенно, это другой способ сделать это, но я попробую.