多个用户控件中使用的单个用户控件实例

时间:2012-03-14 09:28:20

标签: wpf prism

我正在研究Prism WPF应用程序。 场景是我有一个视图(过滤器说ViewF)和另外两个将包含ViewF的视图。 XAML中的内容如下:

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

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

问题是我想在View1和view2中使用相同的ViewF实例和状态。我尝试将ViewF的datacontext传递给View1和View2,但这不起作用,因为xaml本身正在创建不同的实例。

任何想法请分享如何做到这一点。

3 个答案:

答案 0 :(得分:1)

您不能在不同的父母中拥有相同的UserControl实例。 XAML会为您生成The instance of UserControl is already added as child to another container之类的异常。为什么需要UserControl的“同一个实例”?不可能。您应该通过DataContext以某种方式分享此功能。

答案 1 :(得分: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;}}
}    

在每个视图的xaml中,即对于View1和View2,通过绑定将ViewFViewModel设置为datacontext。

答案 2 :(得分:0)

您可以将过滤器定义为共享resource,例如

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