писать приложение VTK в WPF, пытаясь следовать MVVM

1

Поэтому я довольно новичок в WPF и MVVM, и, хотя я понимаю эту предпосылку, многие из этих вещей похожи на попытку прочитать иероглифы для меня.

В основном, моя ситуация такова: я использую Activiz, aС# wrapper для VTK, которая является библиотекой обработки изображений/визуализации. Итак, в этой библиотеке есть элемент управления WinForms, называемый vtk: RenderWindowControl, который является элементом управления opengl, содержащим класс, который обрабатывает все функции визуализации. Я думаю, было бы проще просто использовать WinForms, но это не вариант для меня.

Итак, чтобы использовать vtk: RenderWindowControl в WPF-приложении, мне просто нужно вставить его в WindowsFormsHost, а затем я могу использовать его более или менее точно так же, как код примера, в коде позади (если это правильный термин для.xaml.cs файл)

Это хорошо для тестового приложения, но на практике я хотел бы, если возможно, следовать за MVVM. Здесь я столкнулся с стеной. Если "renderControl" живет в классе View, как я могу ссылаться на него и использовать его из ViewModel? Я думаю, что привязка - это ответ на этот вопрос, но я только знаю, как это сделать для простых типов и команд.

Следуя идеям в другом потоке, я нашел, мне удалось настроить что-то вроде этого ответа

Мое codebehind выглядит так:

public partial class RenderPanel_View : UserControl
{
    public static readonly new DependencyProperty RWControlProperty =
        DependencyProperty.Register("RWControl", typeof(RenderWindowControl), typeof(RenderPanel_View), new PropertyMetadata(null));

    public RenderWindowControl RWControl
    {
        get { return (RenderWindowControl)GetValue(RWControlProperty); }
        set { SetValue(RWControlProperty, value); }
    }

    public RenderPanel_View()
    {
        // This is necessary to stop the rendercontrolwindow from trying to load in the 
        // designer, and crashing the Visual Studio. 
        if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) {
            this.Height = 300;
            this.Width = 300;
            return;
        }

        InitializeComponent();
        this.RWControl = new RenderWindowControl();
        this.RWControl.Dock = System.Windows.Forms.DockStyle.Fill;
        this.WFHost.Child = this.RWControl;
    }
}

Мой.xaml выглядит так

<UserControl x:Class="vtkMVVMTest.RenderPanel.RenderPanel_View"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:vtk="clr-namespace:Kitware.VTK;assembly=Kitware.VTK"
         xmlns:rp="clr-namespace:vtkMVVMTest.RenderPanel"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         RWControl="{Binding VMControlProperty}">
    <Grid>
        <WindowsFormsHost x:Name ="WFHost"/>
    </Grid>
</UserControl>

Итак, две вещи. Один, последняя строка заголовка xaml является ошибкой: "Член RWControl не распознается и не доступен". Я не понимаю, почему. Во-вторых, для того, что я предполагаю, является половиной уравнения ViewModel, как следует определить VMControlProperty?

Я, по крайней мере, на правильном пути здесь, или это отходит от базы?

Теги:
xaml
wpf
mvvm
vtk

1 ответ

0

Некоторые элементы управления не совместимы с MVVM, и вы можете видеть ViewModel в интерфейсе View и напрямую взаимодействовать с ним. Не открывайте весь элемент управления ViewModel, он разрушит способность писать тесты, поместите интерфейс сверху, например IRenderPanelView, и откройте в интерфейсе только те функции, которые вам нужны для доступа из ViewModel. Затем вы можете создать свойство DP этого типа в представлении, установить его в конструкторе и связать с ним свойство ViewModel.View в xaml.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню