根据对象类型将视图注入 ItemsControl

2024-03-17

我有一项服务返回 Party 类型的数组。政党有两个子类型:个人和组织。我在 WPF 应用程序(Prism、MVVM)中从视图模型使用此服务。在此视图模型的构造函数中,我填充了 Party 类型的可观察集合:

public PhoneBookViewModel(IPhoneBookService phoneBookProxy)
{
    _phoneBookProxy = phoneBookProxy;

    var parties = _phoneBookProxy.GetAllParties();
    _parties = new ObservableCollection<Party>(parties.ToList());
}

到目前为止,一切都很好。在我的 PhoneBookView 中,我有一个绑定到该集合的 ItemsControl。在此控件中,我想通过使用另一个视图(及其视图模型)来渲染每个方。因此,当 Party 的类型为 Person 时,注入 PersonView 并将 Party 对象传递给 PersonViewModel 的构造函数,当 Party 的类型为 Organization 时,渲染 OrganizationView 等等...您明白了(或?)。

但我不知道如何在 XAML 中执行此操作。有任何想法吗? 这可能不是最好的方法,所以如果您可以推荐更好的方法,请赐教:-)

Thanks!


让我们从模型的角度来检查这一点:


假设我们有 2 种不同类型的视图,1 种类型的视图模型:

ViewA --> 使用 DataTemplate/DataTemplateSelector 在 itemscontrol 内创建,绑定 > 到 ViewModel

ViewB --> 使用 DataTemplate/DataTemplateSelector 在 itemscontrol 中创建,绑定到 ViewModel

如果两个视图都绑定到相同的视图模型,那么您最终会得到相同的视图。


让我们用 2 种不同类型的视图和 2 种不同类型的视图模型重试:

ViewA --> 使用 DataTempate/DataTemplateSelector 在项目控件中创建,绑定到 ViewModelA --> 绑定到 ModelA

ViewB --> 使用 DataTemplate/DataTemplateSelector 在项目控件中创建,绑定到 ViewModel --> 绑定到模型 B

这个有可能。


现在,如果您像这样对视图模型和模型进行建模(伪代码):

public PhoneBookViewModel
{
    public PhoneBookViewModel()
    {
        _parties = new ObservalbeCollection<PartyViewModel>();
    }

    private PhoneBook _dataContext;

    // This is the property the VM uses to access the model
    public PhoneBook DataContext
    {
        get { return _dataContext; }
        set
        {
            if (_dataContext != null)
            {
                _dataContext.Parties.CollectionChanged -= OnModelPartiesChanged;
            }
            _dataContext = value;
            if (_dataContext != null)
            {
                _dataContext.Parties.CollectionChanged += OnModelPartiesChanged;
            }
        }
    }

    private ObservableCollection<PartyViewModel> _parties;

    // This is the property the view uses to access the collection of VM parties
    public ObservableCollection<PartyViewModel> PartiesViewModels { get { return _parties; } }

    private void OnModelPartiesChanged(...)
    {
        // Add/remove VMs to/from PartiesViewModels here
    }
}

// Model
public PhoneBook
{
    public PhoneBook()
    {
        _parties = new ObservalbeCollection<Party>();
    }

    private ObservableCollection<Party> _parties;

    // This is the property the VM uses to access the model's parties
    public ObservableCollection<Party> Parties { get { return _parties; } }
}

public PersonViewModel : PartyViewModel
{
    new Person DataContext { get; set; }
}

public PartyViewModel
{
    public Party DataContext { get; set; }
}

那么您将获得每个模型项的正确类型的虚拟机, 视图将绑定到VM项目,而不是模型项目。


查看数据模板:

<DataTemplate x:Target={x:Type myVmNamespace:PersonViewModel}">
    <PersonView/>
</DataTemplate>

<DataTemplate x:Target={x:Type myVmNamespace:GroupViewModel}">
    <GroupView/>
</DataTemplate>

视图的项目控制:

<!-- Bind to Parties property of PhoneBookVM -->
<!-- Uses datatemplates for items -->
<ListView ItemsSource={Binding Parties}"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据对象类型将视图注入 ItemsControl 的相关文章

随机推荐

  • $.post 仅适用于警报 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 当我调用带有警报的功能时 该功能运行良好 function post var cvs client nbr val var cs cs va
  • Ruby on Rails:在单个数据库单元中保存多个值

    如何在 Ruby on Rails 应用程序中的单个单元格记录中保存多个值 如果我有一个名为Exp列名为 Education Experience and Skill 如果我希望用户在单行中存储多个值 例如 教育机构或技能 最佳实践是什么
  • 崩溃报告显示在 App Store Connect 中,但不显示在 Xcode Organizer 中

    我们已将应用程序上传到 TestFlight 进行 Beta 测试 当应用程序在测试人员的设备上崩溃时 崩溃会按预期显示在 App Store Connect 中 但不会显示在 Xcode Organizer 中 管理器中的崩溃选项卡显示了
  • PagedListAdapter.submitList() 更新现有项目时行为异常

    本主题的小故事 应用程序只是在确认后通过对话框更新单击的行的值 在房间数据库上使用分页方案 当添加或删除项目时 会获取最新的数据集并将其传递给submitList方法 然后所有更改都会被看到并且运行良好 问题从这里开始 如果更新了现有项目
  • 设置 AssemblyInfo.cs 的默认值

    更改创建 AssemblyInfo cs 的默认值的最佳方法是什么 例如我不想要 AssemblyCompany 和 AssemblyCopyright 中的 Microsoft 位 assembly AssemblyCompany Mic
  • 使用Python unicode的特殊字符问题

    usr bin env python coding utf 8 def splitParagraphIntoSentences paragraph break a paragraph into sentences and return a
  • Python ctypes 参数与 DLL - 指向双精度数组的指针

    我是一名使用 Python 中的 ctypes 的新手编码人员 并尝试使用用 C 编写的 DLL 中的函数 我在 SO 上发现了很多与我类似的问题 但没有任何答案可以回答此类难题 我已经很好地加载了 DLL 但是我需要调用的函数之一需要一个
  • marionette.js 布局/区域结构和渲染方法示例

    我正在尝试使用 marionette js 作为我的主干应用程序 但我对如何组织布局 区域并渲染它们感到有点困惑 我正在寻找一个具有嵌套布局和区域的示例应用程序 以便我可以更好地理解 有什么建议吗 看看这个小提琴 http jsfiddle
  • Guid.NewGuid() 返回重复项?

    我们有一个应用程序可以为我们的一项服务生成模拟数据以用于测试目的 每个数据项都有一个唯一的 Guid 然而 当我们对模拟器进行一些小的代码更改后运行测试时 它生成的所有对象都具有相同的 Guid 创建了一个数据对象 然后是一个 for 循环
  • Cocoa 应用程序最简单的 Markdown 实现是什么?

    我正在用 Objective C 编写一个 Cocoa 应用程序 并且我希望能够合并 Markdown 用户以 Markdown 语法输入文本 单击 导出 按钮 程序将输出 XHTML 文件 不过 似乎有很多选择 我可以使用其中之一C C
  • 代码契约和异步

    将后置条件添加到返回的异步方法的推荐方法是什么Task
  • 如何检测 Android 应用程序何时最小化?

    如何检测 Android 应用程序何时进入后台 onPause 或 onUserLeaveHint 有效 但在方向更改或呈现另一个活动时也会被调用 标记的答案是OP问题的解决方法 对于我们其他正在寻找答案的人来说 您可以使用以下方法来实现这
  • 如何使用 tablayout 在 vi​​ewpager 中设置当前选项卡

    我有一个使用选项卡布局的自定义视图页面 由于某些原因禁用了滑动 内容根据选择的选项卡而变化 我想用浓缩咖啡测试一下 1 单击特定选项卡 2 查看选项卡特定页面的部分数据 我怎样才能做到这一点 我是浓缩咖啡新手 有几种方法可以做到这一点 一种
  • @PreAuthorize 如何检查角色? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有几个 REST API 我想将安全性置于所有这些之上 以便仅允许某些角色使用这些功能 我将 EnableGlobalMethodSecu
  • torch数据集的结构是怎样的?

    我开始使用 torch 7 我想制作我的数据集进行分类 我已经制作了像素图像和相应的标签 但是 我不知道如何将这些数据提供给火炬 我阅读了其他人的一些代码 发现他们使用的是扩展名为 t7 的数据集 我认为它是张量类型 这样对吗 我想知道如何
  • 错误代码:1222。使用的 SELECT 语句具有不同的列数

    我尝试了一些语句 包括连接 但无法将其他三个 MySQL 表中的数据插入到一个表中 在我的最后一次尝试中 我收到此错误 错误代码 1222 使用的 SELECT 语句具有不同的列数 请参阅下面我输入的查询 我是编码新手 所以我对 MySQL
  • 在服务器中下载 YouTube 视频

    我创建了一个 YouTube 搜索引擎 下载 MP3 转换脚本 我用过Jeckman 的 YouTube 下载器 https github com jeckman YouTube Downloader blob master getvide
  • Pandas 如何过滤一个系列

    在执行 groupby name 并在其他列上使用 Mean 函数后 我有一个这样的系列 name 383 3 000000 663 1 000000 726 1 000000 737 9 000000 833 8 166667 谁能告诉我
  • 具有不同形状的 Tensorflow 数据集

    我使用卷积网络对不同形状的图像进行分类 我找不到在 Tensorflow 中加载图像的方法 基于这个问题 https github com tensorflow tensorflow issues 2354它应该与 tf data Data
  • 根据对象类型将视图注入 ItemsControl

    我有一项服务返回 Party 类型的数组 政党有两个子类型 个人和组织 我在 WPF 应用程序 Prism MVVM 中从视图模型使用此服务 在此视图模型的构造函数中 我填充了 Party 类型的可观察集合 public PhoneBook