2012-03-14 36 views
0

我正在使用Prism WPF應用程序。 該場景是我有一個視圖(與過濾器說ViewF)和2個其他視圖將包含ViewF。類似下面的XAML:在多個用戶控件中使用Usercontrol的單個實例

<UserControl View1> 
    <local:ViewF/> 
</UserControl>` 

<UserControl View2> 
    <local:ViewF/> 
</UserControl> 

的問題是,我想使用相同的實例和ViewF的狀態視圖1和視圖2。我試圖將ViewF的datacontext傳遞給View1和View2,但這不起作用,因爲xaml本身正在創建不同的實例。

任何想法請分享如何做到這一點。

回答

1

您不能在不同的父母中擁有UserControl的相同實例。 XAML將爲您生成一個例外,如The instance of UserControl is already added as child to another container。爲什麼你需要UserControl的「相同實例」?不可能。您應該通過DataContext以某種方式分享此功能。

+0

幾乎同樣的事情戰鬥。您的評論使我的思想走上正軌。我忘記了MVC和類似的基本概念。共享數據無法查看。 – Yash 2015-08-20 11:44:25

0

如果我理解你的問題是正確的,這會幫助你。

讓我們假設,每個視圖都有一個ViewModel。假設View1VM,View2VM和ViewFVM分別是View1,View2和ViewFM的虛擬機。讓MainVM成爲將託管View1和View2的窗口的ViewModel。

在MainVM中有一個ViewFVM的實例。在創建View1VM和View2VM的實例時,注入MainVM的實例(也可以使用接口,以便只將相關數據公開給每個View),並在View1和View2中都有一個屬性,它返回mainVM的ViewFVM的實例。將它綁定到xaml中的ViewF的datacontext。

代碼會是什麼樣子,

public class ViewFVM 
{ 
    //Store the state of ViewF 
} 

public class MainVM 
{ 
    public ViewFVM viewFVM; 
    public MainVM() 
    { 
     View1VM view1VM = new View1VM(this); 
     View2VM view2VM = new View2VM(this); 
    } 
} 

public class View1VM 
{ 
    private MainVM _mainVM; 
    public View1VM(MainVM mainVM) 
    { 
     _mainVM = mainVM; 
    } 

    public ViewFVM ViewFViewModel {get {return _mainVM.viewFVM;}} 
} 

public class View2VM 
{ 
    private MainVM _mainVM; 
    public View2VM(MainVM mainVM) 
    { 
     _mainVM = mainVM; 
    } 

    public ViewFVM ViewFViewModel {get {return _mainVM.viewFVM;}} 
}  

在各視圖,即,對於視圖1和視圖2的XAML,通過結合設置ViewFViewModel作爲DataContext的。

0

您可以將過濾器定義爲共享的resource,例如,

<Application.Resources> 
    <local:ViewF x:Key="filters"/> 
</Application.Resources> 
<UserControl> <!-- View1 --> 
    <StaticResource ResourceKey="filters"/> 
</UserControl> 
<UserControl> <!-- View2 --> 
    <StaticResource ResourceKey="filters"/> 
</UserControl> 
相關問題