C#如何使用Caliburn.Micro将WPF GeometryModel3D绑定到ViewModel?

3
我正在尝试将我的 XAML 中的 GeometryModel3D 与 C# ViewModel 中的属性绑定。我使用 Caliburn.Micro 来实现 MVVM,以下是我在视图 XAML 中尝试绑定的简化片段:

<GeometryModel3D Geometry="{Binding Path=MyProperty.MyGeometry}" />

Original Answer翻译成"最初的回答"
<Viewport3D>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <Model3DGroup>
                <GeometryModel3D x:Name = "CubeVisual_Cube">
            </Model3DGroup>
        </ModelVisual3D.Content>
    </ModelVisual3D>
</Viewport3D>

"最初的回答":在我的C#视图模型中:
private CubeModel _cubeVisual = new CubeModel();
public CubeModel CubeVisual
{
    get { return _cubeVisual; }
    set
    {
        _cubeVisual = value;
        NotifyOfPropertyChange(() => CubeVisual);
    }
}

CubeVisual有一个构造函数,完全建立了GeometryModel3D的几何形状和材质。最后是创建GeometryModel3D属性的CubeModel类的代码片段: "CubeVisual有一个构造函数,可以完整地建立GeometryModel3D的几何形状和材质。以下是创建GeometryModel3D属性的CubeModel类的代码片段:"
public class CubeModel
{
    private GeometryModel3D _cube;
    public GeometryModel3D Cube
    {
        get { return _cube; }
        set { _cube = value; }
    }
}

当我执行这段代码时,我的视图中的立方体没有正确地绑定到Geometry3D。在我的CubeVisual属性内没有触发断点。没有任何错误生成来帮助我解决问题。你有什么想法,我做错了什么?谢谢。"最初的回答"

1
дҪ иғҪеңЁдёҚеҸ—Caliburn.Microзҡ„е№Іжү°дёӢе®ҢжҲҗеҗ—пјҹеҰӮжһңдёҚиғҪпјҢиҜ·е…Ҳе°қиҜ•йӮЈдёӘгҖӮеҰӮжһңжңүд»»дҪ•з»‘е®ҡй—®йўҳпјҢVSзҡ„иҫ“еҮәзӘ—еҸЈдјҡе‘ҠиҜүдҪ гҖӮ - undefined
我正在考虑放弃使用MVVM,以便可以与xaml.cs文件进行绑定。在我的情况下,这可能是值得的,因为我是唯一的开发人员,而且这是一个小项目。 - undefined
你可以并且应该在没有Caliburn Micro的情况下使用MVVM。 - undefined
1个回答

3
Viewport3D不支持数据绑定,因此即使使用普通的INPC甚至Caliburn Micro也无法让其正常工作。如果你问我,这实在是非常烦人,因为对于2D来说应该没有任何理由导致它与现在的情况不同,也就是说,你应该能够将Viewport3D用作ItemsControl面板,然后使用数据模板根据场景视图模型集合填充场景中的图形对象(如果无法完全按此方式实现,则应至少类似)。然而,遗憾的是,在三维类中没有包含这些内容,因此我们只能使用这种半支持的杂烩方法,其中单个三维对象属性是具有完全绑定支持的适当依赖属性,但实际的场景管理本身却不是。

所以基本上,如果您想要这个功能,您必须自己动手去实现。创建一个带有“ItemsSource”依赖属性的用户控件,然后设置集合更改通知,以便在列表中的项目更改时相应地更新场景。如何将视图模型映射到实际的3D场景对象取决于你,一个可能的解决方案是使用视图模型作为你想要表示的3D对象的关键字(值得注意的是,在2D的情况下,数据模板实际上就是这样工作的......<DataTemplate DataType="{x:Type viewModelType}>只是<DataTemplate x:Key="{x:Type viewModelType}> 的语法糖)。


谢谢。这很有道理。这绝对是一种不同的做法,但我会试一试。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接