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

时间:2011-10-26 14:29:37

标签: c# wpf xaml mvvm prism

我在ParentView(DashboardConsultants)中有一个gridview,当用户的mousepointer悬停在一个单元格上时,它会显示一个自定义工具提示。工具提示显示一个View(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>

My 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的协议(在此示例中它是{{1 }})。

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

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

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

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

就个人而言,我觉得WPF视图只不过是对ViewModel的反映。因此View实际上不应该将任何数据传递给ViewModels - 而应该反映ViewModel的数据。

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

查看

答案 2 :(得分:0)

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

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

object ActiveItem {get;set;}

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

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