【问题标题】:Pass info from Parent View to Child ViewModel将信息从父视图传递到子视图模型
【发布时间】:2011-10-26 14:29:37
【问题描述】:

我的 ParentView(DashboardConsultants) 中有一个 gridview,当用户的鼠标指针悬停在单元格上时,它会显示自定义工具提示。工具提示显示了一个视图 (AgreementDetails_View),它显示了绑定到该单元格的协议的信息。我将展示我现在拥有的代码,以便您更好地理解我的问题:

ParentView 中的 DataGrid 单元格:

<DataGridTextColumn Header="Okt" Width="*" x:Name="test">
    <DataGridTextColumn.ElementStyle>
       <Style TargetType="{x:Type TextBlock}">                                   
            <Setter Property="Tag" Value="{Binding Months[9].AgreementID}"/>
            <Setter Property="Background" Value="White" />
            <Setter Property="DataGridCell.ToolTip" >
                <Setter.Value>
                     <v:UC1001_AgreementDetails_View Background="#FFF" Opacity="0.88"  />
                </Setter.Value>
            </Setter>

我的 ChildView:

 public UC1001_DashBoardConsultants_View(UC1001_DashboardConsultantViewModel viewModel)
        {
            InitializeComponent();
            this.DataContext = viewModel;
        }  

在 ViewModel 中,我有以下方法从数据库中获取正确的协议:

 private void GetRefData()
        {
            UC1001_ActiveAgreementArguments args = new UC1001_ActiveAgreementArguments();
            args.AgreementID = 3;
            DefaultCacheProvider defaultCacheProvider = new DefaultCacheProvider();
            if (!defaultCacheProvider.IsSet("AgrDet:" + args.AgreementID))
            {
                ConsultantServiceClient client = new ConsultantServiceClient();

                AgreementDetailsContract = client.GetAgreementDetailsByAgreementID(args);
                defaultCacheProvider.Set("AgrDet:" + args.AgreementID, AgreementDetailsContract, 5);
            }
            else
            {
                AgreementDetailsContract = (UC1001_ActiveAgreementContract)defaultCacheProvider.Get("AgrDet:" + args.AgreementID);
            }
        }

正如您现在所看到的,该方法始终调用相同的协议,(我这样做是为了测试目的)但现在我想要在 DataGrid 单元标记中指定 ID 的协议(在本例中为 Months[9].AgreementID )。

我可以在子视图的构造函数中将其提供给 ViewModel,但我认为由于 MVVM 模式(或者是否允许?),它是不允许的。

所以我的问题是:如何将 ParentView 中指定的 AgreementID 传递给 ChildView 的 ViewModel 以获得 ChildView 的正确数据?

当然,可以很乐意提供更多信息/代码/说明,请问:)

提前致谢!

【问题讨论】:

    标签: c# wpf xaml mvvm prism


    【解决方案1】:

    不确定我是否以正确的方式提出问题,但我的感觉是您需要使用命令而不是通过将引用传回父级本身来引入绑定耦合

    【讨论】:

    • 我也想到了命令,但我无法在 Tooltip 属性中定义命令(我可以在其中调用 Month[].AgreementID),还是建议将命令放在其他地方?
    • 问题是为什么父视图显示协议的详细信息?为什么协议视图不这样做(实际上与协议视图模型绑定,其中引用了底层协议)?
    • 什么意思? ParentView 有一个网格,每个单元格都包含一个 AgreementID。当我将鼠标悬停在单元格上时,它会显示一个视图的工具提示,其中包含该协议的更多信息(不仅仅是协议 ID)
    • 所以每个单元格都可以代表一个协议视图,并且在协议视图的数据上下文中应该是协议视图模型,它公开了所有协议属性。这将是 MVVM
    • 从业务逻辑的角度来看,以下是否有意义 -DashboardConsultantsViewModel 有一个 AgreementViewModel 列表?
    【解决方案2】:

    就我个人而言,我觉得 WPF 视图应该只不过是 ViewModel 的一个漂亮反映。所以View 实际上不应该将任何数据传递给ViewModels - 相反它应该反映 ViewModel 的数据。

    在您的情况下,我会将一个属性附加到每个 DataGrid 行中显示的对象。例如,如果您的 DataGrid 包含 Agreement 对象,我将确保每个 Agreement 对象都有一个名为 AgreementDetails 的属性,可以从 ToolTip 中查看该属性

    【讨论】:

    • 父 ViewModel 没有协议对象,只有具有 ID 的对象,例如我的问题示例中的 Month[9].AgreementID
    • @JelleCapenberghs 您的 DataGrid 绑定到什么?
    • DataGrid 的 ItemsSource 绑定到一个模型(在我的情况下是 WCF 合同),其中包含有关协议顾问的一些信息、当月的状态以及包含以下内容的合同列表所有月份的信息
    • @JelleCapenberghs 所以这不是收藏?我在想你的视图绑定到你的ViewModel,而DataGrid 绑定到Contacts 的列表。从那里开始,每个Contact 都会有一个AgreementDetails 属性
    • 对不起,这是 WCF 合约的 ObservableCollection。与联系我假设你的意思是 WCF 合同?所以你建议把整个协议放在 WCF 合同中,而不是只放在协议 ID 中?这不是对应用程序的性能有害吗?
    【解决方案3】:

    通过构造函数或属性传入该 ID eitehr 是完全合法和有效的。我不确定您的代码,但如果您的父级可以访问您的模型,您也可以将模型传递到您的视图模型中(即通过构造函数、属性或方法)。

    在这种情况下,我经常做的一件事是在我的 Parent 的 ViewModel 中添加如下属性:

    object ActiveItem {get;set;}
    

    然后我将该 ActiveItem 绑定到我的网格中的 ActiveItem。

    <DataGrid SelectedItem="{Binding ActiveItem}">
    </DataGrid>
    

    【讨论】:

    • 所以你建议把ID绑定到ParentViewModel,然后传给ChildViewModel,它把正确的信息传给ChildView?这是有道理的,我如何将活动的 DataGrid 单元格(及其 ID)绑定到 ActiveItem 属性?
    • 假设这是您所说的默认 WPF 数据网格,您可以将 ViewModel 中的 ActiveItem 属性绑定到网格上的 SelectedItem 属性
    • 工具提示在我将鼠标悬停在单元格上时显示,而不是在我选择它(单击它)时显示,它是否仍然适用于 SelectedItem 绑定?
    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多