Tag: mvvm light

如何在两个ViewModel之间建立通信/传递数据

我知道这个问题已经被多次询问了,我已经阅读了很多关于它的答案。 然而,它们都没有满足我的要求,因此我需要一些建议。 我正在开发的应用程序看起来像这样: http : //screenshooter.net/100101493/smrkpog 它是基于MVVM Light Toolkit的WPF MVVM应用程序。 带网格的区域是ListBox + Canvas 。 这些项目(让我们称之为“Neumes”)再次由ListBox + Canvas组成,并由用户动态创建。 每个Neume都由’Elements’组成,它们呈现为红色形状。 当用户双击Neume时,将打开一个新窗口。 它应该允许编辑(翻译,resize,旋转)所选Neume的元素。 我想要做的是将存储在MainViewModel中的SelectedNeume(带有一个Elements列表)传递给我新创建的窗口的ViewModel。 我对如何实现这个有一些想法 : 完全跳过新的ViewModel并将MainViewModel设置为新窗口的DataContext , 在新的ViewModel中创建一个’MainViewModel’字段,并在打开一个新窗口时将其传递给那里 使用MVVM Light Toolkit提供的Messaging / Mediator模式。 我正在寻找既简单又整洁的解决方案。 我很乐意使用选项3.但就WPF而言,我是一个相对新手,并且不知道如何真正开始。 此外,我担心当主ListBox上的双击事件被触发时,新窗口打开的事实可能会出现问题,因为我找不到将命令绑定到ListBoxItem的方法。它的Style还是DataTemplate(事件触发器/ EventToCommand解决方案对我不起作用)。 这是事件: private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) { var item = ((FrameworkElement)e.OriginalSource).DataContext as Neume; if (item != null) { var […]

MVVM Light Messenger Class

任何人都可以提供关于如何在MVVM Light中使用信使类的样本/链接/简单插图/video/演示吗?

MVVM Light Toolkit – Messenger使用Event Aggregator或Mediator Pattern?

有人可以帮我解决一下,如果来自MVVM light toolkit的 I / Messenger类(和实现)演示了Event Aggregator Pattern或Mediator Pattern的使用吗? 如果某人建议它部分地遵循这两种模式,那么我要求详细说明哪个部分的实现类似于保持答案有效的模式。 参考:两种模式之间的比较 ,这是绝对有趣的。

Windows 8上具有共享目标的InvalidCastException

我正在尝试使用Windows 8“Metro Styled Apps”,MVVM Light,并希望创建一个共享目标 – 到目前为止一切顺利。 但是如果我在OnShareTargetActivated方法中并且想要将项添加到ObservableCollection,我会在类类型和COM对象之间捕获InvalidCastException。 Das COM-Objekt des Typs“System.Collections.Specialized.NotifyCollectionChangedEventHandler”kann nicht in den Klassentyp“System.Collections.Specialized.NotifyCollectionChangedEventHandler”umgewandelt werden。 Instanzen von Typen,die COM-Komponentenrepräsentieren,könnennichtin andere Typen umgewandelt werden,die keine COM-Komponentenrepräsentieren。 Echn Umwandlung in Schnittstellen istjedochmöglich,sofern die zugrunde liegende COM-Komponente QueryInterface-AufrufefürdieIID derSchnittstelleunterstützt。 英文版: 无法将类型为“System.Collections.Specialized.NotifyCollectionChangedEventHandler”的COM对象强制转换为类类型“System.Collections.Specialized.NotifyCollectionChangedEventHandler”。 表示COM组件的类型实例不能转换为不代表COM组件的类型; 但是只要底层的COM组件支持对接口的IID的QueryInterface调用,它们就可以转换为接口。 现在我有点困惑,不知道如何正确处理这种行为。 MainViewModel main1 = new ViewModelLocator().Main; MainViewModel main2 = new MainViewModel(); var conversation […]

WPF MVVM从VIEW MODEL获取父级

在MVVM WPF应用程序中。 如何从ViewModel设置第二个Windows父级? 例: view1 – viewModel1 viewModel1的命令调用: var view2 = new view2 view2.Owner = <—-这是问题所在。 如何从viewModel获取view1作为所有者? view2.Show() 编辑: 请参阅下面接受的答案,然后阅读以下编辑内容。 我正在使用MVVM灯 – > http://mvvmlight.codeplex.com/ (真棒顺便说一句) 烘焙消息传递系统非常棒。 我现在正在从viewmodel向我的视图发送一条消息,告诉它显示另一个窗口。 对于消息我当前在主视图中使用带有switch语句的字符串来确定要打开的视图; 但是我可能会修改也是MVVM light toolkit一部分的令牌。 谢谢!

Silverlight构造函数注入视图模型+设计模式

我试图在Silverlight 4中编写可测试的ViewModel。我正在使用MVVM灯。 我使用AutoFac和IoCContainer正在完成它的工作。 但是要注入ViewModel的构造函数,它绑定到Views我有这个构造函数链接: public UserViewModel() : this(IoCContainer.Resolve()) { } public UserViewModel(IUserServiceAsync userService) { if (this.IsInDesignMode) return; _userService = userService; } 哪个不干净,但是到目前为止我找到的最佳选择。 这是有效的,我的应用程序可以根据需要工作,并且可以通过控制倒置来测试 但是,我的VM绑定到我的视图,如下所示: 在我的XAML页面属性中,VS2010和Blend中的设计模式都不起作用。 是否有更好的方法来实现我在Silverlight中尝试仍然适用于设计模式的东西? 失去设计模式不是一个交易破坏者,但在学习XAML时会很方便。 一个更干净的无链接方式会很好! 我认为可以使用AutoFac / IoC将视图模型解析为视图,就像上面的XAML标记方法一样,并沿着这条路走下去? 谢谢。

如果接口位于不同的程序集中,则SimpleIoc.Default.Register在IsInDesignModeStatic处失败

在ViewModelLocator类的静态构造函数中, SimpleIoc.Default.Register(); 如果接口位于不同的项目中,则在IsInDesignModeStatic模式下失败。 因此, MainWindow.xaml设计器在设计时是空的。 我已经做了一个简单的解决方案来测试它。 我所做的只是将DataItem类和IDataService接口移动到Domain项目中。 在这里下载 我找到了一个随处:在ClientWpf项目中添加指向IDataService.cs的链接。 public class ViewModelLocator { static ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); if (ViewModelBase.IsInDesignModeStatic) { // It fails if the IDataService is in different assembly // Delete the link of IDataService.cs from the ViewModel folder… SimpleIoc.Default.Register(); } else { SimpleIoc.Default.Register(); } SimpleIoc.Default.Register(); } … }

WP7:为什么ListBox.ItemsPanel会破坏我的ElementName数据绑定?

我有一个Windows Phone 7 ListBox绑定到一个整数列表。 我使用默认的MVVM Light模板,因此有一个ViewModel类包含数据和一个简单的RelayCommand 。 这是ListBox: 这将在按钮内显示一个垂直的整数列表。 如果单击其中任何一个,则执行以下命令代码并显示弹出窗口: new RelayCommand(i => MessageBox.Show(“Test” + i)); 但是,如果我只是添加以下XAML以更改为水平列表,则数据绑定将失败。 单击按钮时没有任何操作,并且没有错误消息写入“输出”窗口。 我已经为EventToCommand尝试了一些其他类型的绑定。 例如,将我的ViewModel指定为静态资源。 它有效,但不如上面的例子理想。 为什么ItemsPanel打破了数据绑定?

MVVM light Messenger中的操作,局部变量和垃圾收集的奇怪行为

我对MVVM Light中的Messenger系统有一个非常奇怪的问题。 这很难解释,所以这里有一个小程序来演示这个问题: using System; using GalaSoft.MvvmLight.Messaging; namespace TestApp { class Program { static void Main(string[] args) { var prog = new Program(); var recipient = new object(); prog.RegisterMessageA(recipient); prog.RegisterMessageB(recipient); prog.SendMessage(“First Message”); GC.Collect(); prog.SendMessage(“Second Message”); } public void RegisterMessageA(object target) { Messenger.Default.Register(this, (Message msg) => { Console.WriteLine(msg.Name + ” recieved by A”); var x = […]

从Windows Phone 8.1通用应用程序中的View Model导航到新页面

我正在开发一个Windows Phone 8.1通用应用程序,并希望找到处理页面导航的最佳方法,而不会在后面的代码中使用大量逻辑。 我希望尽可能整洁地将代码保留在我的视图中。 为响应按钮点击,导航到新页面的MVVM方式是什么? 我目前必须从ViewModel向视图发送一条RelayComnmand消息,其中包含要导航到的页面的详细信息。 这意味着后面的代码必须按如下方式连接: public MainPage() { InitializeComponent(); Messenger.Default.Register(this, (article) => ReceiveOpenArticleMessage(article)); … } private object ReceiveOpenArticleMessage(OpenArticleMessage article) { Frame.Navigate(typeof(ArticleView)); } 虽然这确实有效,但这似乎并不是最好的方法。 如何直接从ViewModel进行页面导航? 我在我的项目中使用MVVM-Light。