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

本文关键字:视图 模型 信息 | 更新日期: 2023-09-27 18:12:22

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

DataGrid Cell in ParentView:

<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 Cell Tag中指定ID的协议(在本例中是Months[9].AgreementID)。

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

所以我的问题是:我如何通过在我的ParentView指定的协议id到ChildView的ViewModel获得正确的数据为ChildView?

当然,更多的信息/代码/澄清可以很高兴地提供,只要问:)

提前感谢!

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

不确定我的问题是否正确,但我觉得你需要使用Commands而不是通过将引用传递给父类本身来引入绑定耦合

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

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

查看该属性。

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

在这种情况下,我经常做的一件事是在我的Parent的ViewModel中添加如下属性:
object ActiveItem {get;set;}

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

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