簡體   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