我正在研究Prism WPF应用程序。 场景是我有一个视图(过滤器说ViewF)和另外两个将包含ViewF的视图。 XAML中的内容如下:
<UserControl View1>
<local:ViewF/>
</UserControl>`
<UserControl View2>
<local:ViewF/>
</UserControl>
问题是我想在View1和view2中使用相同的ViewF实例和状态。我尝试将ViewF的datacontext传递给View1和View2,但这不起作用,因为xaml本身正在创建不同的实例。
任何想法请分享如何做到这一点。
答案 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>