gpt4 book ai didi

wpf - 根据对象类型将 View 注入(inject) ItemsControl

转载 作者:行者123 更新时间:2023-12-02 04:10:07 26 4
gpt4 key购买 nike

我有一个服务返回一个派对类型的数组。党有两个子类型,个人和组织。我正在我的 WPF 应用程序(Prism、MVVM)中从 View 模型中使用此服务。在这个 View 模型的构造函数中,我填充了一个 Party 类型的 observable 集合:

public PhoneBookViewModel(IPhoneBookService phoneBookProxy)
{
_phoneBookProxy = phoneBookProxy;

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

到现在为止还挺好。在我的 PhoneBookView 中,我有一个绑定(bind)到此集合的 ItemsControl。在这个控件中,我想通过使用另一个 View (及其 View 模型)来呈现每个派对。所以当Party是Person类型时,注入(inject)PersonView并将Party对象传递给PersonViewModel的构造函数,当Party是Organization类型时,渲染OrganizationView,等等......你得到了图片(或?)。

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

谢谢!

最佳答案

让我们从模型的角度检查一下:

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

ViewA --> Created within an items control using DataTempate/DataTemplateSelector, Binded > to ViewModelA

ViewB --> Created within an items control using DataTempate/DataTemplateSelector, Binded to ViewModelA



如果两个 View 都绑定(bind)到同一个 View 模型,您最终会得到相同的 View 。

让我们用 2 种不同类型的 View 和 2 种不同类型的 View 模型再试一次:

ViewA --> Created within an items control using DataTempate/DataTemplateSelector, Binded to ViewModelA --> Binded to ModelA

ViewB --> Created within an items control using DataTempate/DataTemplateSelector, Binded to ViewModelB --> Binded to ModelB



这个有可能。

现在,如果您像这样(伪代码)对 View 模型和模型进行建模:
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; }
}

然后您将获得每个模型项的正确类型的虚拟机,
View 将绑定(bind)到 VM 项,而不是模型项。

查看的数据模板:
<DataTemplate x:Target={x:Type myVmNamespace:PersonViewModel}">
<PersonView/>
</DataTemplate>

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

View 的项目控制:
<!-- Bind to Parties property of PhoneBookVM -->
<!-- Uses datatemplates for items -->
<ListView ItemsSource={Binding Parties}"/>

关于wpf - 根据对象类型将 View 注入(inject) ItemsControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5693863/

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