SharpGL + WPF: события Draw никогда не вызываются

Я пытаюсь создать приложение SharpGL с помощью WPF, но у меня возникают проблемы с интеграцией модели представления.

Я привязываю DataContext элемента OpenGLControl к свойству OpenGLControl в моей ViewModel и создаю события для функций рисования в модели представления, но они никогда не позвони.

OpenGLControl отображается как черный экран. Когда я просто реализую функцию рисования в коде файла xaml.cs, он работает, но я действительно хочу использовать модель представления.

<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>

Код ViewModel:

    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
    }

person unbekanntespferd    schedule 25.03.2018    source источник


Ответы (1)


DataContext в WPF определяет, как и к каким именно свойствам будет привязана привязка. То, что вы делаете, устанавливая DataContext, например <sharpGL:OpenGLControl DataContext="{Binding OpenGLControl}" />, по существу заключается в следующем: при поиске свойств, требуемых привязкой, ищите внутри OpenGLControl ViewModel.

Это не работает, потому что вы создаете два OpenGLControl, один из которых создается в XAML через <sharpGL:OpenGLControl/>, а второй создается внутри вашей ViewModel. Затем вы устанавливаете события для вашей ViewModel (которая не видна) и указываете OpenGLControl, созданному в XAML, что он должен искать данные, которые требуются любой Binding для просмотра внутри OpenGLControl в ViewModel.

Поскольку OpenGLControl — это элемент управления, вы, вероятно, не должны думать о нем как о хорошем кандидате для ViewModel. Вместо этого попробуйте создать обработчик событий в окне и перенаправить все обратные вызовы событий отрисовки из окна в вашу ViewModel, например. вызов делегата.

person ZiggZagg    schedule 25.03.2018