gpt4 book ai didi

c# - 通过 View 模型传递信息

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:12 24 4
gpt4 key购买 nike

打开客户端文件时,我需要选择的 clientId 来指示应该查询哪条记录。我试图将 ViewModel 公开为页面上的静态资源,以便可以通过绑定(bind)轻松访问它。

可以通过此链接找到绑定(bind)到静态资源的原因。 http://www.telerik.com/help/silverlight/gridview-troubleshooting-blank-cells.html

// Open an individual record when double-clicked.
public void Open()
{
if (SelectedItem != null)
{
var vm = new LoanViewModel(Events);
vm.ById(SelectedItem.Id);
Events.PublishOnUIThread(new ShowTabEvent(vm));
}
this.OnPropertyChanged("Items");
}

LoanViewModel.cs

public LoanViewModel()
{ .... Query needs LoanId}

public void ById(int id)
{}

更多信息来自此链接问题 Having my Viewmodel appear in namespace dropdown

最佳答案

首先,您不应在 ViewModels 构造函数中执行查询操作。您不应该在类的构造函数中执行任何“昂贵”的操作。

其次,ViewModel 不应该知道其他 ViewModel。所以你不应该在另一个 ViewModel 中实例化一个 ViewModel。

我建议采用不同的方法。与其尝试将 ID 直接传递给 ViewModel,不如通过事件聚合器来传递。事件聚合器基本上是一个消息传递系统,用于在 ViewModel 之间以解耦的方式发送消息。

一个 ViewModel 注册到某个事件,另一个 ViewModel 发送它的事件,而不知道这个事件是否有任何订阅者或这个订阅者可能是谁。例如 PRISM IEventAggregator

您在 ViewModel 中获取您选择的 EventAgregator 实例(通过依赖注入(inject)或通过服务定位器)并在构造函数中注册您的事件

public class LoanViewModel 
{
public LoanViewModel()
{
IEventAggregator events = ... ; // get via ServiceLocator or via Constructor for DI
events.GetEvent<CustomerLoadedEvent>().Subscribe(OnCustomerLoaded);
}

private void OnCustomerLoaded(Customer customer)
{
int customerId = customer.ID;

// do your query now
}
}

public class OtherViewModel
{
IEventAggregator events;

public LoanViewModel()
{
this.events; = ... ; // get via ServiceLocator or via Constructor for DI
}

// Should be ICommand for WPF binding...assuming SelectedItem is from type Customer
public void Open()
{
if (SelectedItem != null)
{
events.GetEvent<CustomerLoadedEvent>().Publish(SelectedItem);
}
this.OnPropertyChanged("Items");
}
}

这样您的 ViewModel 就完全相互分离了。

当然,PRISM/CompositeFramework 对您的需求来说可能有点矫枉过正。您可以使用其他更简单的事件聚合器或制作您自己的事件聚合器。 api可能不一样,思路是一样的

关于c# - 通过 View 模型传递信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27137205/

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