0

我正在尝试使用 WPF 构建一个 SharpGL 应用程序,但是在集成视图模型时遇到了麻烦。

我将 OpenGLControl 的DataContext绑定到ViewModel中的OpenGLControl属性,并为视图模型中的绘图函数创建事件,但它们从未被调用。

OpenGLControl只是显示为黑屏当我只是在xaml.cs文件后面的代码中实现绘图功能时,它可以工作,但我真的想使用 viewModel。

<Window.DataContext>
    <local:ViewModel />
</Window.DataContext>

[...]

<StackPanel Orientation="Horizontal">
        <GroupBox Width="80" Header="Controls">
            <StackPanel>
                <TextBox Text="{Binding TranslationX}" />
                <TextBox Text="{Binding TranslationY}" />
                <TextBox Text="{Binding TranslationZ}" />
            </StackPanel>

        </GroupBox>
        <sharpGL:OpenGLControl x:Name="GLControl" DataContext="{Binding OpenGLControl}" MinWidth="350"/>
</StackPanel>

视图模型代码:

    private OpenGLControl openGLControl = new OpenGLControl();
    public OpenGLControl OpenGLControl
    {
        get
        {
            return openGLControl;
        }
        set
        {
            openGLControl = value;
            NotifyPropertyChanged(); //Custom implementation of 
                                     //INotifyPropertyChanged
        }
    }
    public ViewModel()
    {
        OpenGLControl.OpenGLDraw += drawEvent;
    }
    private void drawEvent(object sender, OpenGLEventArgs args)
    {
        draw(args.OpenGL); // draws a number of vertices, works when used in 
                           //  code behind
    }
4

1 回答 1

0

WPF 中的 ADataContext控制绑定将绑定到的确切属性的方式和对象。通过设置 DataContext <sharpGL:OpenGLControl DataContext="{Binding OpenGLControl}" />基本上是这样的:在搜索Binding 所需的属性时,在 OpenGLControl ViewModel 中搜索。

这不起作用,因为您正在创建两个 OpenGLControl,一个是在 XAML 中创建的,<sharpGL:OpenGLControl/>另一个是在您的 ViewModel 中创建的。接下来,您为 ViewModel(不可见)设置事件并指示在 XAML 中创建的 OpenGLControl 它应该搜索任何Binding所需的数据,以查看 ViewModel 中的 OpenGLControl 内部。

由于 OpenGLControl 是一个控件,因此您可能不应该将其视为 ViewModel 的良好候选者。而是尝试在窗口中创建一个事件处理程序,并通过例如调用委托将所有绘制事件回调从窗口转发到您的 ViewModel。

于 2018-03-25T20:56:37.010 回答