C# MVVM将控制句柄传递给模型
在我的模型中,我使用一个外部.dll文件,它需要处理UI控件,以便在上面显示一些图像。我猜与.dll相关的逻辑属于模型,而不是UI 我有一个观点。在这个视图中,我看到: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
<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();
}
}