C# Viewmodel在需要之前实例化

C# Viewmodel在需要之前实例化,c#,wpf,xaml,mvvm,viewmodel,C#,Wpf,Xaml,Mvvm,Viewmodel,我对MVVM有点问题。让我先简单地描述一下我的问题 我有一个父视图(DashboardConsultants),它有一个datagrid。数据网格中的每个单元格都有一个工具提示,实现方式如下: <UserControl.Resources> <ResourceDictionary> <DataTemplate DataType="{x:Type vm:UC1001_AgreementDetailsViewModel}">

我对MVVM有点问题。让我先简单地描述一下我的问题

我有一个父视图(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>
class MainViewModel
{
    ObservableCollection<AgreementViewModel> Agreements;
}

class AgreementViewModel
{ 
    // Loaded only when getter is called
    AgreementDetailViewModel AgreementDetails;
}
我在ViewModel Initialize上放置了一个断点,当我进入父视图时触发,但当我进入子视图时应该触发(因此在datagrid中打开工具提示时)。有人知道我怎么解决这个问题吗

如有需要,可提供更多信息/代码

编辑:

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

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


看起来您的视图直接引用了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>

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

 <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>
class MainViewModel
{
    ObservableCollection<AgreementViewModel> Agreements;
}

class AgreementViewModel
{ 
    // Loaded only when getter is called
    AgreementDetailViewModel AgreementDetails;
}
class主视图模型
{
可观察的收款协议;
}
类协议视图模型
{ 
//仅在调用getter时加载
协议详情视图模型协议详情;
}

请购买一份框架设计指南。要么读你自己,要么打败决定你输入名字形式的人。另外,更严肃地说,你有没有试过制作一个非常简单的原型,这是你的问题?你似乎在做很多复杂的事情,这些事情可能会以几种不同的方式中断……功能的总体概念并不难理解。我只想将视图显示为工具提示,其中包含来自ViewModel的数据。这是我第一次使用WPF和MVVM,所以我自己也不知道如何解决这个问题:)工具提示存在于逻辑树之外,因此它们不会像预期的那样继承DataContext。我不能花足够的时间仔细研究你的问题,以找出这是否是你问题的根源。您可以在此处搜索数据绑定工具提示,并找到许多有关此问题的问题。我想我也发布了一些关于这个问题的答案…@威尔,我不认为这是正确的。。。菜单位于逻辑树之外,但工具提示应位于同一树中。我最近更新了一个项目,将一些详细信息移动到工具提示中,绑定一点也没有更改。请尝试在用户控件中绑定
DataContext={binding AgreementDetailsViewModel}
,而不是将其绑定到工具提示上。我得到了解决方案,请检查我的问题。我认为你的答案是可以接受的,因为这个答案在整个过程中帮助了我。谢谢
<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;
}