[英]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.