我的wpf应用程序中有一个计时器,每5分钟就会询问一次WCF服务。如果服务有我的应用程序的消息,我会得到一个包含文本数据和特定代码的列表。
此代码提供有关必须加载以打印数据的视图的信息。
我有两个ViewModel(两者的数据源相同):一个用于Ticker >一个视图和一个用于弹出窗口>两个观点
项目文件:
数据源:
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打勾时,我不明白如何启动我的观点。我已经阅读了文档,但我需要一些提示来理解这种机制。
答案 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如何观察注射......