将信息从父视图传递给子视图模型
本文关键字:视图 模型 信息 | 更新日期: 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>