如何解决使用 Ninject 和 MVVM 进行多重绑定和上下文绑定
- 我有一个
import matplotlib.pyplot as plt import matplotlib.animation as animation import pandas as pd import mplfinance as mpf import matplotlib.animation as animation idf = pd.read_csv('aapl.csv',index_col=0,parse_dates=True) #df = idf.loc['2011-07-01':'2012-06-30',:] pkwargs=dict(type='candle',mav=(20,200)) fig,axes = mpf.plot(idf.iloc[0:20],returnfig=True,volume=True,figsize=(11,8),panel_ratios=(3,1),title='\n\nS&P 500 ETF',**pkwargs,style='starsandstripes') ax1 = axes[0] ax2 = axes[2] ax1.spines['top'].set_visible(True) ax1.grid(which='major',alpha=0.1) ax2.grid(which='major',alpha=0.1) #fig = plt.figure() def run_animation(): ani_running = True def onClick(event): nonlocal ani_running if ani_running: ani.event_source.stop() ani_running = False else: ani.event_source.start() ani_running = True def animate(ival): if (20+ival) > len(idf): print('no more data to plot') ani.event_source.interval *= 3 if ani.event_source.interval > 12000: exit() return #print("here") #mpf.plot(idf,addplot=apd) data = idf.iloc[100+ival:(250+ival)] print(idf.iloc[ival+250]) ax1.clear() ax2.clear() mpf.plot(data,ax=ax1,volume=ax2,style='yahoo') fig.canvas.mpl_connect('button_press_event',onClick) ani = animation.FuncAnimation(fig,animate,interval=240) run_animation() mpf.show()
,它在启动时从本地Interface
文件中获取数据(反序列化) 此接口注入了 3 个功能 - 使用
Json
,所有 3 个功能都按我的预期正确运行,使用来自本地 json 文件的 3 个不同设备配置 - 当我希望我的
Contextual Name Binding
显示所有 3 个设备的设置时,我必须获取所有 3 个绑定并将它们注入MainView
,如下面的代码 - 问题是
MainViewModel
从内核中没有得到任何东西,因为我在绑定 DeviceConfig 时使用了MainViewModel
,当我删除它时,内核确实返回了数组中的 3 个实例 - 我想知道是否有任何方法可以在不删除
.WhenParentNamed(devicename)
上下文绑定的情况下获取所有 DeviceConfig 实例。这是我的第一个在线问题,抱歉我的英语不好,感谢您的阅读!!
WhenParentNamed
public interface IDeviceConfig
{
int Param1 {get;set;}
int Param2 {get;set;}
...
}
internal class DeviceConfig : IDeviceConfig
{
int Param1
{
}
int Param2
{
}
...
}
public sealed partial class App : Application
{
var kernel = new StandardKernel();
var AllDevices = GetDeviceConfigFromJson();
if (AllDevices.Count > 0)
{
for (var i = 0; i < AllDevices.Count; i++)
{
var devicename = i.ToString();
kernel.Bind<IDeviceConfig>().ToConstant(AllDevices.ElementAt(i)).WhenParentNamed(devicename);
kernel.Bind<IFeature1>().To<Feature1>().Named(devicename);
kernel.Bind<IFeature2>().To<Feature2>().Named(devicename);
kernel.Bind<IFeature3>().To<Feature3>().Named(devicename);
//Each device has 3 features and all 3 features get property from DeviceConfig
//on startup all device get config and run
kernel.Get<IFeature1>(devicename);
kernel.Get<IFeature2>(devicename);
kernel.Get<IFeature3>(devicename);
}
}
kernel.Bind<MainViewModel>.ToSelf();
Current.MainWindow = kernel.Get<MainView>();
Current.MainWindow.Show();
}
解决方法
我发现了一个丑陋的方法,但它有效!
kernel.Bind<IDeviceConfig>.ToConstant(AllDevices.ElementAt(i)).Named(devicename);
kernel.Bind<IFeature1>().To<Feature1>().InSingletonScope().WithConstructorArgument("config",kernel.Get<IDeviceConfig>(devicename))Named(devicename);
var feature1 = kernel.Get<IFeature1>(devicename);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。