Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM将控制句柄传递给模型_C#_Wpf_Mvvm - Fatal编程技术网

C# MVVM将控制句柄传递给模型

C# MVVM将控制句柄传递给模型,c#,wpf,mvvm,C#,Wpf,Mvvm,在我的模型中,我使用一个外部.dll文件,它需要处理UI控件,以便在上面显示一些图像。我猜与.dll相关的逻辑属于模型,而不是UI 我有一个观点。在这个视图中,我看到: <WindowsFormsHost x:Name="winformsHost" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5,0,5,0"/> 然后在ViewModel中,我将其传递给模型: public Ma

在我的模型中,我使用一个外部.dll文件,它需要处理UI控件,以便在上面显示一些图像。我猜与.dll相关的逻辑属于模型,而不是UI

我有一个观点。在这个视图中,我看到:

    <WindowsFormsHost x:Name="winformsHost" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5,0,5,0"/>
然后在ViewModel中,我将其传递给模型:

    public MainWindowViewModel (WindowsFormsHost containerForRenderPanel)
    {
        model = new Model (containerForRenderPanel);
    }  
最后,在模型中,我正在创建一个新控件,现在我可以从模型中访问它的句柄:

public class Model : BindableBase
{
    private WindowsFormsHost renderPanelContainer;

    public WindowsFormsHost RenderPanelContainer
    {
        get { return renderPanelContainer; }
        set { SetProperty(ref renderPanelContainer, value); }
    }

    public Model(WindowsFormsHost container)
    {
        RenderPanelContainer = container;
        RenderPanelContainer.Child = new System.Windows.Forms.Panel();   
    }
}

我知道这种方法违反了MVVM模式。如何将控制柄从视图控件传递到模型?

创建对象类型的可观察集合面板。将该集合绑定到WindowsFormsHost子元素。

创建对象类型的可观察集合面板。将该集合绑定到您的WindowsFormsHost子元素。

模型为什么要执行与UI相关的工作?在视图中保持工作状态?在我的模型中,我使用一个外部.dll文件,该文件需要UI控件的句柄来直接在此控件上显示某些内容。您可以提供一种传递该信息的方法,例如,在创建视图时,会调用某个VM方法(该方法反过来调用model方法).你能给我举一些我能理解的例子吗?我对WPF和MVVM模式还很陌生。据我所知,如果“调用了某个VM方法”,则VM将需要引用视图,以读取控件的句柄并将其传递给模型。这也是一件坏事。一般来说,让模型知道UI不利于MVVM,但在您的情况下,似乎没有任何方法可以避免它。我对此的一般解决方案是在VM上放置一个公共属性,并让UI的代码中的一些代码在窗口的
DataContextChanged
事件中更新属性(或实际绑定到VM的任何内容),并引用您需要的实际控件。为什么模型要做与UI相关的工作?在视图中保持工作状态?在我的模型中,我使用一个外部.dll文件,该文件需要UI控件的句柄来直接在此控件上显示某些内容。您可以提供一种传递该信息的方法,例如,在创建视图时,会调用某个VM方法(该方法反过来调用model方法).你能给我举一些我能理解的例子吗?我对WPF和MVVM模式还很陌生。据我所知,如果“调用了某个VM方法”,则VM将需要引用视图,以读取控件的句柄并将其传递给模型。这也是一件坏事。一般来说,让模型知道UI不利于MVVM,但在您的情况下,似乎没有任何方法可以避免它。我的一般解决方案是在VM上放置一个公共属性,并让UI代码中的一些代码在窗口的
DataContextChanged
事件中更新属性(或实际绑定到VM的任何内容),并引用您需要的实际控件。因此,在ViewModel中,我将创建一个类型为Panel的可观察集合。创建模型时,它可以将控制柄返回到面板(面板将在模型内部创建)。然后这个句柄将被放入在VM中创建的ObservableCollection中。最后,视图将WinfowsFormsHost绑定到ObservableCollection。这是一种完全有效的MVVM方法吗?因此,在ViewModel中,我将创建一个类型为Panel的可观察集合。创建模型时,它可以将控制柄返回到面板(面板将在模型内部创建)。然后这个句柄将被放入在VM中创建的ObservableCollection中。最后,视图将WinfowsFormsHost绑定到ObservableCollection。这是一种完全有效的MVVM方法吗?
public class Model : BindableBase
{
    private WindowsFormsHost renderPanelContainer;

    public WindowsFormsHost RenderPanelContainer
    {
        get { return renderPanelContainer; }
        set { SetProperty(ref renderPanelContainer, value); }
    }

    public Model(WindowsFormsHost container)
    {
        RenderPanelContainer = container;
        RenderPanelContainer.Child = new System.Windows.Forms.Panel();   
    }
}