2017-02-21 66 views
1

我開發一個應用MVVMWPF結合contentcontrol.child叫了兩聲

我想綁定到WindowsFormHost我application.But WindowsFormHost不是dependancyproperty。

因此,在我的視圖模型中創建一個新的WindowsFormHost並將其綁定到contentcontrol.But的孩子,但我遇到了綁定調用兩次,當我運行程序。

有什麼建議?

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

回答

0

這裏的根本問題是,你創建的每個屬性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],其中有足夠的詳細信息,可以準確顯示您實際嘗試解決的更廣泛的目標。

+0

感謝您的建議。是的,彼得我知道它沒有任何意義,在我給出的實現。在我的MVVM應用程序,我想集成一個只支持winforms的SDK。所以我使用wpf windowsformshost作爲解決方案但是在視圖中定義SDK邏輯對我來說不是一個好主意,因爲我想要一個更新視圖狀態的可重用組件。 – user3559351