C# 使用Caliburn Micro的参数为WP提供导航服务
众所周知,CM不支持通过MVVM Light之类的导航服务传递复杂类型的对象。所以我找了一个解决办法,就这样做了 有两种视图模型:MainPageViewModel和SubPageViewModel 我首先定义了3个类,即GlobalData、SnapshotCache和StockSnapshot。StockSnapshot是我希望在两个viewmodels之间传递的对象的类型C# 使用Caliburn Micro的参数为WP提供导航服务,c#,windows-phone-7,caliburn.micro,C#,Windows Phone 7,Caliburn.micro,众所周知,CM不支持通过MVVM Light之类的导航服务传递复杂类型的对象。所以我找了一个解决办法,就这样做了 有两种视图模型:MainPageViewModel和SubPageViewModel 我首先定义了3个类,即GlobalData、SnapshotCache和StockSnapshot。StockSnapshot是我希望在两个viewmodels之间传递的对象的类型 public class SnapshotCache : Dictionary<string, StockSna
public class SnapshotCache : Dictionary<string, StockSnapshot>
{
public StockSnapshot GetFromCache(string key)
{
if (ContainsKey(key))
return this[key];
return null;
}
}
public class GlobalData
{
private GlobalData()
{
}
private static GlobalData _current;
public static GlobalData Current
{
get
{
if (_current == null)
_current = new GlobalData();
return _current;
}
set { _current = value; }
}
private SnapshotCache _cachedStops;
public SnapshotCache Snapshots
{
get
{
if (_cachedStops == null)
_cachedStops = new SnapshotCache();
return _cachedStops;
}
}
}
public class StockSnapshot
{
public string Symbol { get; set; }
public string Message { get; set; }
}
这就是问题所在。当我运行程序时,我发现它总是先运行到快照的getter,这时符号还没有初始化。所以后来我尝试添加一些额外的代码来消除ArgumentNullException,这样它就可以运行到Symbol的setter,然后一切都会正常进行,只是UI不会得到更新
谁能告诉我哪里错了?
提前谢谢 为什么不直接使用:
private string _symbol;
public string Symbol
{
get { return _symbol;}
set
{
_symbol = value;
NotifyOfPropertyChange(() => Symbol);
NotifyOfPropertyChange(() => Snapshot);
}
}
public StockSnapshot Snapshot
{
get { return Symbol!=null? GlobalData.Current.Snapshots[Symbol]:null; }
}
在这种情况下,当Symbol为null(无论如何都是合理的方法!)并且设置了“Symbol”时,您不会尝试从GlobalData获取数据,而是调用NotifyOfPropertyChange()在快照上强制重新获取属性。为什么不将GlobalData注册为singleton并将其注入需要它的ViewModel?我尝试过这样做,只是为了在BootStrapper的GetInstance()上获得一个奇怪的MissingMethodException,而不知道出了什么问题。奇怪的是,我经常这样做,但没有遇到过。这似乎是一个解决办法。不管怎样,这对我来说很好。最后一个版本的Caliburn Micro出现了问题。在我把它更新到最新版本后,一切进展顺利。:)
private string _symbol;
public string Symbol
{
get { return _symbol; }
set
{
_symbol = value;
NotifyOfPropertyChange(() => Symbol);
}
}
public StockSnapshot Snapshot
{
get { return GlobalData.Current.Snapshots[Symbol]; }
}
private string _symbol;
public string Symbol
{
get { return _symbol;}
set
{
_symbol = value;
NotifyOfPropertyChange(() => Symbol);
NotifyOfPropertyChange(() => Snapshot);
}
}
public StockSnapshot Snapshot
{
get { return Symbol!=null? GlobalData.Current.Snapshots[Symbol]:null; }
}