【问题标题】:WPF binding to contentcontrol.child called twiceWPF 绑定到 contentcontrol.child 调用了两次
【发布时间】:2017-02-21 07:01:08
【问题描述】:

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

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

所以在我的视图模型中创建一个新的 WindowsFormHost 并将其绑定到 contentcontrol 的子项。但是我在运行程序时遇到了两次调用的绑定。

有什么建议吗??

我的 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
    }
}

【问题讨论】:

    标签: c# wpf mvvm binding


    【解决方案1】:

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

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

    private readonly Lazy<WindowsFormsHost> _myWindow =
        new Lazy<WindowsFormsHost>(() => new WindowsFormsHost() { Child = newWindow });
    
    public WindowsFormsHost myWindow
    {
        get { return _myWindow.Value; }
    }
    

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

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

    您的视图模型根本不应该创建视图对象。您可以并且应该在 XAML 中声明 WindowsFormsHost 它的子元素,就像您声明任何其他视图组件一样。

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

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

    【讨论】:

    • 感谢您的建议。是的,彼得我知道这在我给定的实现中没有任何意义。在我的 MVVM 应用程序中,我想集成一个仅支持 winforms 的 SDK。所以我正在使用wpf windowsformshost 作为解决方案。但是在视图中定义 SDK 逻辑对我来说不是一个好主意,因为我想要一个可重用的组件来更新视图状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多