C # Как связать WPF GeometryModel3D с ViewModel с помощью Caliburn.Micro - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь привязать GeometryModel3D из моего XAML к свойству свойства в моей ViewModel в C #. Я использую Caliburn.Micro, чтобы установить MVVM. Ниже приведен упрощенный фрагмент того, как я пытаюсь выполнить привязку в моем View 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 Ответ

1 голос
/ 17 марта 2019

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

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

...