gpt4 book ai didi

c# - Viewmodel 在需要之前实例化

转载 作者:行者123 更新时间:2023-11-30 22:34:19 24 4
gpt4 key购买 nike

我对 MVVM 有一点疑问。让我先勾勒出我的问题。

我有一个包含数据网格的父 View (DashboardConsultants)。 DataGrid 中的每个单元格都有一个工具提示,实现方式如下:

 <UserControl.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type vm:UC1001_AgreementDetailsViewModel}">
<v:UC1001_AgreementDetails_View />
</DataTemplate>
</ResourceDictionary>
</UserControl.Resources>

<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="DataGridCell.ToolTip">
<Setter.Value>
<vm:UC1001_AgreementDetailsViewModel />
</Setter.Value>
</Setter>

工具提示调用我的 ViewModel (AgreementDetailsViewModel),它具有以下代码:

public UC1001_ActiveAgreementContract AgreementDetailsContract { get; set; }

public int AgreementID { get; set; }

public UC1001_AgreementDetailsViewModel()
{
AgreementDetailsContract = new UC1001_ActiveAgreementContract();
this.Initialize();
}

private void Initialize()
{
GetRefData();
ShowAgreementDetailsView();
}

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);
}
}


private void ShowAgreementDetailsView()
{
// Initialize
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();

// Show content
var agreementDetailsWorkspace = new Uri("UC1001_AgreementDetails_View", UriKind.Relative);
regionManager.RequestNavigate("ContentRegion", agreementDetailsWorkspace);
}

ViewModel 的目标是从数据库(目前是静态的...)获取协议(protocol),然后将其传递给 subview (UC1001_AgreementDetails_View) 以显示为工具提示。 subview 具有以下构造函数,因此控件可以绑定(bind)到协定:

public UC1001_AgreementDetails_View(ViewModels.UC1001_AgreementDetailsViewModel UC1001_AgreementDetailsViewModel)
{
InitializeComponent();
this.DataContext = UC1001_AgreementDetailsViewModel.AgreementDetailsContract;
}

我在 ViewModel Initialize 上放置了一个断点,当我进入父 View 时它会触发,但当我进入 subview 时它应该会触发(因此在数据网格中打开工具提示时)。有谁知道我该如何解决这个问题?

如果需要,可以提供更多信息/代码。

编辑:

我尝试了一些东西,现在我得到了这样的东西(我觉得它更接近解决方案)。

我将工具提示更改为以下内容(根据 Rachels 的帮助):

<Setter Property="DataGridCell.ToolTip">
<Setter.Value>
<v:UC1001_AgreementDetails_View DataContext="{Binding AgreementDetailsViewModel}" />
</Setter.Value>
</Setter>

在我的 subview 中,我放置了以下绑定(bind)

<Label Content="{Binding AgreementDetailsContract.Header}" Height="50" HorizontalAlignment="Left" Margin="8,6,0,0" Name="_labelHoofding" VerticalAlignment="Top" FontSize="22" />

现在我的 AgreementDetailsViewModel 是我的 subview 的 DataContext,它有一个名为 AgreementDetailsContract 的属性,其中包含我想要显示的所有信息。但是我的问题仍然存在。 AgreementDetailsViewModels 在打开 ConsultantDashboard 时触发,而它应该在显示工具提示时打开。我可以在工具提示上放置某种事件/命令来触发 ViewModel 吗?另外,我认为我的标签的绑定(bind)有问题,因为它没有显示信息(尽管 ViewModel 没有传递正确的信息可能是同样的问题)。

同样,如果您觉得它有点复杂,我很乐意进一步解释它,或者如果被要求提供更多代码。

已解决:

我得到了解决方案。我在 ChildView 的构造函数而不是其 XAML 或 View 工具提示中指定绑定(bind)。

public UC1001_AgreementDetails_View()
{
InitializeComponent();
this.DataContext = new UC1001_AgreementDetailsViewModel();
}

最佳答案

看起来您的 View 直接引用了 ViewModel,这意味着它将在启动时创建您的 ViewModel 的副本

这段代码

<Setter Property="DataGridCell.ToolTip">
<Setter.Value>
<vm:UC1001_AgreementDetailsViewModel />
</Setter.Value>
</Setter>

应该是

<Setter Property="DataGridCell.ToolTip">
<Setter.Value>
<!-- If you want to keep the DataTemplate, use a ContentControl -->
<v:UC1001_AgreementDetails_View DataContext="{Binding AgreementDetails}" />
</Setter.Value>
</Setter>

您的数据结构应如下所示:

class MainViewModel
{
ObservableCollection<AgreementViewModel> Agreements;
}

class AgreementViewModel
{
// Loaded only when getter is called
AgreementDetailViewModel AgreementDetails;
}

关于c# - Viewmodel 在需要之前实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7890434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com