如何在CaliburnMicro下的WPF中加载ViewModel / View

时间:2015-03-17 13:39:46

标签: c# wpf mvvm data-binding caliburn.micro

我的wpf应用程序中有一个计时器,每5分钟就会询问一次WCF服务。如果服务有我的应用程序的消息,我会得到一个包含文本数据和特定代码的列表。

此代码提供有关必须加载以打印数据的视图的信息。

我有两个ViewModel(两者的数据源相同):一个用于Ticker >一个视图和一个用于弹出窗口>两个观点

项目文件:

  1. 查看
    • 弹出
      • PopHighView.xaml
      • PopMediumView.xaml
    • 定单
      • TickerLayout.xaml
      • TickerNormal.xaml
  2. 视图模型
    • PopViewModel
    • TickerViewModel
  3. 模型
    • AlertModel.cs
  4. ViewParsers
    • AlertParser.cs
  5. 数据源:

        public class AlertParser : IAlertParser{    
            AlertServiceClient service;    
            public List<AlertModel> TickerAlertData()    
            {        
                try        
                {           
                    service = new AlertServiceClient();           
                    List<AlertModel> items = (from item in service.GetActiveAlert()                 select new AlertModel        
                           {                  
                              Alertid= item.AlertId,                  
                              Alertstartdate = item.AlertStartDate,                  
                              Alerttitle = item.AlertTitle,                  
                              Alerttxt = item.AlertText               
                           }).ToList();            
                    return items;        
                }        
                catch        
                {             
                return null;         
                }    
            }
       }
    

    当我的应用程序启动时,没有加载的视图,系统托盘中只有一个图标(使用wpf notifyicon)。

    我的问题是,在这些情况下,当我的计时器从我的服务中返回true时,我不明白如何加载一对ViewModel / View并将数据传递给它们。

    网络上的许多示例都加载了主视图,这就是我丢失的原因(例如在校准微页面上的指挥示例)。

    感谢您的帮助!

    编辑:

    好的,我的计时器看起来像那样:

    if (service.IsAlertReady()=true)
    {
        string hostName = Dns.GetHostName();
        string myIP = Dns.GetHostEntry(hostName).AddressList[0].ToString();
        service.IsAlertForMe(myIP);
        if(service.IsAlertForMe(myIP) == true)
        {
           ShellViewModel shell = new ShellViewModel();
           shell.ShowMediumPop();
        }
        else
        ...
    

    ShellViewModel

    public class ShellViewModel : Conductor<object>
    {
        public void ShowMediumPop()
        {
            ActivateItem(new PopViewModel());
        }
    }
    

    PopViewModel

    public class PopViewModel : screen
    {
       protected override void OnActivate()
       {
          base.OnActivate();
       }
    }
    

    PopView.Medium

    <UserControl x:Class="TerminalClientProto.View.PopView"
    ...
    cal:View.Model="{binding}"
    cal:View.Context="Medium"
    >
    

    我很抱歉,但是当我的Ticker打勾时,我不明白如何启动我的观点。我已经阅读了文档,但我需要一些提示来理解这种机制。

1 个答案:

答案 0 :(得分:0)

程序,任何程序,包括包含要显示的视图的程序,都可以通过多种方式显示视图。这里有一些:

    var app = new App();        
    app.InitializeComponent();
    app.Run();  

或者您可以直接启动视图:

   var view = new MyView();
   view.Show(); 
   // or 
   view.ShowDialog();

如果视图是MainWindow,则可以在视图中创建ContentControl区域以注入包含要显示内容的子视图的Usercontrol。这仍然需要MainWindow打开...所以上面的例子在将UserControls注入MainWindow时也会起作用。注入用户控件的行为是将ContentControl的内容设置为用户控件本身的实例。事件处理程序可以很好地处理这种情况......

public void NewUserControlInMainWindow(object sender, UserControl uc){
      //XCC = the Xaml content control in main window
      XCC.Content = uc;
}

我不确定Caliburn如何观察注射......