繁体   English   中英

WPF 绑定到 contentcontrol.child 调用了两次

[英]WPF binding to contentcontrol.child called twice

我正在开发一个 MVVM 应用程序

我想在我的应用程序中绑定到 WindowsFormHost。但 WindowsFormHost 不是依赖属性。

因此,在我的视图模型中,创建一个新的 WindowsFormHost 并将其绑定到内容控件的子项。但是我在运行程序时遇到了两次调用的绑定。

有什么建议??

我的 XAML

<Window x:Class="Demo.View.area"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Demo.View"
    mc:Ignorable="d"
    Title="area" Height="300" Width="300">
   <ContentControl Content="{Binding myWindow}" />
</Window>

我的 viewModel.cs 包含以下实现

public WindowsFormsHost myWindow
{
    get
    {
       return new WindowsFormsHost() { Child = newWindow }; 
       //newWindow defined in another place
    }
}

这里的根本问题是每次调用属性 getter 时都会创建一个新对象。 在极少数情况下,这是一个好主意,当然也不是您的情况。

我们可以通过不这样做来解决眼前的问题。 例如:

private readonly Lazy<WindowsFormsHost> _myWindow =
    new Lazy<WindowsFormsHost>(() => new WindowsFormsHost() { Child = newWindow });

public WindowsFormsHost myWindow
{
    get { return _myWindow.Value; }
}

这将推迟对象的创建,直到第一次调用属性 getter,但之后将始终返回相同的值。

但这并不能真正解决您更广泛的问题。 您的问题中没有足够的上下文来理解为什么您认为此代码有用,但我认为它不太可能是您真正想要的代码。

您的视图模型根本不应该创建视图对象。 您可以而且应该声明WindowsFormsHost在XAML其子,就像你将任何其他视图组件。

包含WindowsFormsHost组件作为ContentControl的子级也没有意义。 它本身就是一个完全有效的控件,不需要容器。

此答案应解决您所询问的具体问题。 但我强烈建议您重新考虑您的设计。 好像全错了。 如果您需要这方面的帮助,请发布一个新问题,其中包含一个很好的 [mcve],其中包含足够详细的信息,可以准确显示您实际尝试解决的更广泛的目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM