C# 将信息从父视图传递到子视图模型

C# 将信息从父视图传递到子视图模型,c#,wpf,xaml,mvvm,prism,C#,Wpf,Xaml,Mvvm,Prism,我的ParentView(DashboardConsultants)中有一个gridview,当用户的鼠标指针悬停在单元格上时,它会显示一个自定义工具提示。工具提示显示一个视图(AgreementDetails\u视图),其中显示绑定到该单元格的协议的信息。我将展示我现在的代码,以便您更好地理解我的问题: ParentView中的DataGrid单元格: <DataGridTextColumn Header="Okt" Width="*" x:Name="test"> <

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

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>
在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的协议(在本例中是
月[9]。AgreementID

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

因此,我的问题是:如何将ParentView中指定的AgreementID传递给ChildView的ViewModel,以便为ChildView获取正确的数据

当然,可以提供更多信息/代码/说明,只需询问:)


提前谢谢

我不确定我是否正确地理解了这个问题,但我的感觉是,您需要使用命令,而不是通过将引用传递回父对象本身来引入绑定耦合

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

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

object ActiveItem {get;set;}
然后将该ActiveItem绑定到网格中的ActiveItem

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

就我个人而言,我觉得WPF视图应该只是
视图模型的一个很好的反映。因此,
视图
实际上不应该向
视图模型
传递任何数据,而是应该反映视图模型的数据


在您的情况下,我将为每个DataGrid行中显示的对象附加一个属性。例如,如果您的DataGrid包含
协议
对象,我会确保每个
协议
对象都有一个名为
协议详细信息
的属性,可以从
工具提示

查看该属性,我也想到了命令,但我无法在工具提示属性中定义命令(我可以调用月份[].AgreementID)或建议将命令放置在其他位置?问题是为什么父视图显示协议的详细信息?为什么AgreementView不这样做(它实际上与AgreementViewModel绑定,而AgreementViewModel又引用了一个正在使用的协议)?你是什么意思?ParentView有一个gridd,每个单元格都包含一个AgreementID。当我将鼠标悬停在单元格上时,它会显示一个视图的工具提示,其中包含该协议的更多信息(不仅仅是AgreementID),因此每个单元格都可以表示一个AgreementView,而AgreementView的DataContext中应该是AgreementViewModel,它公开了所有协议属性。这将是MVVM从业务逻辑的角度看,以下内容是否有意义-DashboardConsultantsViewModel有一个AgreementViewModels列表?因此建议将ID绑定到ParentViewModel,然后将其传递给ChildViewModel,后者将正确的信息传递给ChildView?这很有意义,我如何将活动DataGrid单元格(及其ID)绑定到ActiveItem属性?假设这是您正在谈论的默认WPF DataGrid,您可以将ViewModel中的ActiveItem属性绑定到网格上的属性。工具提示在我将鼠标悬停在单元格上时显示,而不是在我选择它时显示(单击它),然后它是否仍然与SelectedItem绑定一起工作?父ViewModel没有协议对象,只有ID为的对象,如my中示例中的月份[9].AgreementIDquestion@JelleCapenberghsDataGrid绑定到什么?DataGrid的ItemsSource绑定到一个模型(在我的例子中是一个WCF合同)其中包含有关协议顾问的一些信息、当月状态以及包含所有项目信息的合同列表months@JelleCapenberghs所以这不是一个收藏?我想您的视图已绑定到您的
视图模型
,而
数据网格
已绑定到
联系人列表
。从这里开始,每个
联系人
都会有一个
协议详细信息
属性。对不起,这是一个可观察到的WCF合同集合。我猜你指的是WCF合同?因此,您建议将整个协议放在WCF合同中,而不是仅放在AgreementID中?这对应用程序的性能不是有害的吗?
<DataGrid SelectedItem="{Binding ActiveItem}">
</DataGrid>