【问题标题】:Associating a ViewModel to a View将 ViewModel 关联到视图
【发布时间】:2018-04-10 11:56:27
【问题描述】:

我有一个主视图和相应的 ViewModel。因为主View太复杂所以我拆分成很多小View;而且每个小View也有自己的ViewModel。

我的问题是如何在主视图中“将子视图模型关联到子视图”?

我是按照下面的方式做的,不知道对不对还是得用DataTemplate?

<StackPanel>
     <local:SmallView-A DataContext="{x:Type local:SmallViewModel-A}" />
</StackPanel>
<StackPanel>
    <local:SmallView-B DataContext="{x:Type local:SmallViewModel-B}" />
</StackPanel>
<StackPanel>
    <local:SmallView-C DataContext="{x:Type local:SmallViewModel-C}" />
</StackPanel>

【问题讨论】:

  • 您可以将主视图拆分为多个用户控件。
  • 这取决于您的主视图模型的结构以及您打算如何使用 SmallView。例如,如果您的主视图模型中有 SmallViewModel 属性,您可以直接绑定 SmallView 的 DataContext,lile &lt;local:SmallViewA DataContext="{Binding SmallViewModelA}"/&gt;。但是,您需要更具体。
  • 而不是 编辑:对不起错字,只需修复您的 XAML。
  • @Clemens,感谢您指出。我修正了错别字。

标签: wpf mvvm


【解决方案1】:

我会说正确的答案如下 :-)...(未测试!)

  1. 在 generic.xaml 中,关联的视图和视图模型
  2. 在您的 MainViewModel 中为每个子视图模型创建属性
  3. 在您的 MainView 中,将 content Presenter 绑定到那里的属性

    通用

    <DataTemplate DataType="{x:Type ViewModels:SubViewModel1}">
        <Views:SubView1 />
    </DataTemplate>
    
    <DataTemplate DataType="{x:Type ViewModels:SubViewModel2}">
        <Views:SubView2 />
    </DataTemplate>
    

    主视图模型

    public SubViewModel1 Sub1 { get; set; }
    public SubViewModel2 Sub2 { get; set; }
    

    主视图

    <Grid>
        ## your layout here 
        <ContentPresenter Content="{Binding Sub1}" />
        <ContentPresenter Content="{Binding Sub2}" />
    
        ##could be
        <TabControl ItemSource="{Binding MyViewModelCollection}" />
    
    </Grid>
    

【讨论】:

    【解决方案2】:

    事实证明很可能使用以下代码。

    <ContentControl Content="{Binding MyViewInstance}">
        <ContentControl.Resources>
            <DataTemplate DataType="x:Type vm:MyViewModel">
            </DataTemplate>
        </ContentControl.Resources>
    </ContentControl>
    

    【讨论】:

      【解决方案3】:

      在您的“视图”文件夹中(如果您还没有,请创建一个)创建一个名为“SmallViewA”的新用户控件。

      在您的主 XAML 中:

      xmlns:views = "clr-namespace:[Your app name].Views"
      
      <views:SmallViewA x:Name = "vSmallViewA" Loaded = "SmallViewALoaded"/>
      
      private void SmallViewALoaded(object sender, RoutedEventArgs e)
      {
          vSmallViewA.DataContext = YoursmallAViewModelshouldgohere;
          // Initialise
      }
      

      在 Views 文件夹中添加 SmallViewA 控件和 SmallViewA 控件。从那里,您可以从 SmallViewA Viewmodel 绑定您的属性。

      SmallViewBSmallViewC 执行上述相同的步骤

      注意:请务必在您的 ViewModel 中实现 INotifyPropertyChanged

      【讨论】:

      • 您能评论一下您投反对票的原因吗?所以我可以改进或删除我的答案?
      • 我认为问题不在于如何去做,而在于哪个更好,这可能就是您的答案被否决的原因;投票者仍然应该添加解释
      • 您可能应该解释一下这应该如何工作,即视图背后的代码应该如何访问相应的视图模型实例。换句话说,YoursmallAViewModelshouldgohere 应该来自哪里?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多