Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Caliburn Micro的参数为WP提供导航服务_C#_Windows Phone 7_Caliburn.micro - Fatal编程技术网

C# 使用Caliburn Micro的参数为WP提供导航服务

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

众所周知,CM不支持通过MVVM Light之类的导航服务传递复杂类型的对象。所以我找了一个解决办法,就这样做了

有两种视图模型:MainPageViewModel和SubPageViewModel

我首先定义了3个类,即GlobalData、SnapshotCache和StockSnapshot。StockSnapshot是我希望在两个viewmodels之间传递的对象的类型

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; }     
}