Tag: mvvm light

没有特定DataContext的绑定不会更新

我有一个MVVM光视图模型,ListBox绑定到List 。 Listbox最初填充得很好,但是当我在运行时更改为不同的列表(而不仅仅是添加项目)时,除非我设置了特定的数据上下文,否则它不会更新。 这样可行: … DataContext=”{Binding MyViewModel, Source={StaticResource Locator}}” 但这不是: DataContext=”{Binding Source={StaticResource Locator}}” 在这两种情况下,我都可以通过set调用来validation是否正确调用了RaisePropertyChanged方法,但在第二种情况下,相关的“get”永远不会发生。 这是按设计工作的,还是MVVM-Light或Silverlight中的错误? 定位: public class ViewModelLocator { private static UnityContainer Container; static ViewModelLocator() { Container = new UnityContainer(); Container.RegisterType(new ContainerControlledLifetimeManager()); } public MyViewModelType MyViewModel { get { return Container.Resolve(); } }

MVVM,对ViewModelLocator和DataTemplate感到困惑,首先导致ViewFirst与ViewModel

我使用MVVMLight,它带有一个ViewModelLocator。 我的初始项目提出了以下问题。 我有一个在查看应用程序时呈现的MainView。 根据单击的按钮,它通过MainView中的ContentControl呈现View1或View2(每个都是用户控件)。 我在MainViewModel中找到了正确的视图模型。 但我发现我还需要一个DataTemplate,以便View1和View2中的用户控件将在MainView中正确呈现,否则它只会显示基于文本的类名。 我对以下内容感到困惑: a)我是否需要两者,一个视图模型定位器和一个DataTemplate来完成上述操作? 我只是跳进了WPF,但我以为我读过一个或另一个不是两个都需要。 或者更具体:为什么我的DataContext=”{Binding LiveDataViewModel, Source={StaticResource Locator}}”>有DataContext=”{Binding LiveDataViewModel, Source={StaticResource Locator}}”> (它解析了对自己的视图模型的绑定)但仍然需要DataTemplate? b)这是视图模型的第一种方法还是视图第一种方法? c)我尝试了一个代码隐藏的解决方案,它实际上花了我4行代码来完成完全相同的事情,带走了我很多类,绕路,eventToCommand和转换器[因为触发视图选择的控件只引发事件而不是命令] ,数据模板,视图模型定位器,不同的视图模型…这看起来是一个巨大的成本,无需任何优势。 把它放到代码背后似乎很完美,因为它是纯粹的UI内容(选择视图并绑定到内容控件,完成)。 我在这里错过了什么吗? 我会通过代码放弃什么? 我是WPF和MVVM的新手,现在我非常沮丧,因为我感觉就像围绕一个看似微不足道的问题而奔波。

MVVM Light Messenger无法按预期运行

前段时间我问了一个问题: 使用MVVM Light的Messenger在View Model之间传递值 我今天去测试答案,但似乎没有起作用。 我的实现如下: MessengerInstance.Send(SelectedDocument, Model.StaticEnums.Tokens.SettingstoMain); 和: MessengerInstance.Register(this, Model.StaticEnums.Tokens.SettingstoMain, settings => CopySettings(settings)); 我的问题是,这种实现不起作用。 相反,MessengerInstance.Send和MessengerInstance.Register的参数似乎与答案中的实现明显不同。 我在这做错了什么? 我上一个问题的答案中的实现是否正确?

如何使用MVVM灯处理WP 8.1上的后退按钮?

我正在寻找适当的方法来使用MVVM light 5上提供的NavigationService来处理Windows Phone 8.1 WinRT上的后退按钮事件。 到目前为止,我认为最好的地方是在ViewModelLocator通过注册NavigationService的GoBack方法,同时按照MVVM Light V5中NavigationService中概述的方法创建它。 这是一种有效的方法。 但是,我在导航之前无法处理validation,因此我想知道是否有更合适的方法来处理此事件。 public class ViewModelLocator { public ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); // Register NavigationService SimpleIoc.Default.Register(CreateNavigationService); // Register ViewModels here } private INavigationService CreateNavigationService() { var navigationService = new NavigationService(); // Register pages here navigationService.Configure(“Details”, typeof(DetailsPage)); // Handle back button HardwareButtons.BackPressed += (sender, args) => { […]

如何重置IOC容器中的所有实例

我使用MVVM Light框架制作了一个C#WPF应用程序。 我的应用程序使用ViewModelLocator类在运行时定位视图模型。 ViewModelLocator使用了与MVVM Light框架一起提供的SimpleIoc类。 这是我的场景:用户登录可以使用我的应用程序。 在注销时,我想处置/重置/重新创建所有viewmodel实例,以便为下一个用户提供干净的环境。 我试图在ViewModelLocator类中实现Cleanup()方法,但它无法正常工作。 不工作意味着(第二个)用户看到之前登录的用户的数据。 第一次尝试: public static void Cleanup() { SimpleIoc.Default.Reset(); } 第二次尝试: public static void Cleanup() { SimpleIoc.Default.Unregister(); SimpleIoc.Default.Unregister(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); } 第三次尝试(不是我想要的,但它是一种解决方法): public static void Cleanup() { // I implemented the ICleanup interface in my viewmodels // The cleanup method clears all my variables eg: myCollection.clear(); SimpleIoc.Default.GetInstance().Cleanup(); SimpleIoc.Default.GetInstance().Cleanup(); […]

WPF将已过滤的ObservableCollection ICollectionView绑定到Combobox

我想根据类型(类型AddPoint)将ObservableCollection过滤为子集,并希望它按升序排序,不重复。 我的基类是ModelBase,w /子类AddPoint,Time,Repeat等…… ObservableCollection MotionSequenceCollection将以任何顺序填充这些类型,有些将是重复的。 我已经尝试了几次不同的时间,并在ICollectionView属性中显示它们,我从’拉出’: 绑定集合的子集 。 可观察的收集 private ObservableCollection _motionSequenceCollection = new ObservableCollection(); public ObservableCollection MotionSequenceCollection { get { return _motionSequenceCollection; } set { if (_motionSequenceCollection == value) { return; } var oldValue = _motionSequenceCollection; _motionSequenceCollection = value; // Update bindings, no broadcast RaisePropertyChanged(); } } public ICollectionView Location { get { var […]

何时何地取消使用mvvmlight的Messenger

我用mvvmlight构建了一个项目。 在VM或VM和View之间使用Messenger发送消息。 现在,我想知道取消注册信使的时间和地点。 你帮帮我吗? 编辑: 这是我的场景: 有一个MainWindow和一个ChildWindow,ChildWindow(包含一个由两个不同UserControl之一组成的ContentControl),通过ChildWindow中的SwitchButton更改ContenControl。 每个窗口或UserControl对应一个ViewModel。 MainViewModel向MainWindow发送消息以打开ChildWindow ; MainWindow打开ChildWindow (首先使用UserControlView1 ,不要使用UserControlView2 ),并向UserControl1ViewModel发送消息做一些事情; 如果用户单击CancelButton, ChildWindowViewModel向ChildWindowViewModel发送一条消息以关闭; 如果ChildWindowViewModel触发UnloadedCommand , ChildWindow向每个UserControlViewmodel发送一条消息来清理一些东西。 注册和取消注册信使的操作放在构造函数和View或ViewModel的析构函数中,还是放在LoadedCommand和UnloadedCommand的委托方法中? View的Loaded和Unloaded命令绑定到LoadedCommand和UnloadedCommand。

在mvvmlight for Windows 8中缺少EventToCommand行为 – 解决?

问题说这一切真的:) 我正在使用MVVM Light在XAML / C#中编写Windows 8应用程序,我注意到EventToCommandfunction尚未实现。 对于任何人都可以提出建议,是否有任何解决方法? 谢谢!

我应该如何在ViewModels之间进行通信?

我正在使用MVVM Light并使用打包的信使系统在视图模型之间进行通信,但是我遇到了一些两难的问题! 基本上,当用户单击客户记录时,将打开相应的视图,并使用它来实例化CustomerViewModel 。 此时, CustomerViewModel需要来自先前视图模型( ViewAllCustomersViewModel )的所选客户ID,以便它可以获取视图所绑定的选定客户信息(仍然跟随?)。 所以最初我的想法也是将来自ViewAllCustomersViewModel (选择要查看的客户)的消息中的ID发送到CustomerViewModel …但是, CustomerViewModel未实例化为能够在加载视图之前接收消息(此时消息已经播出)! 那么,解决这个问题的最佳方法是什么? 到目前为止,我已经考虑过CustomerViewModel在实例化后向ViewAllCustomersViewModel发送请求(基本上说“我准备接收消息”),然后ViewAllCustomersViewModel将ID发送回CustomerViewModel ……但这是一个解决这个问题的必要方法? 这对我来说似乎有点难看! 否则,我在想是否有另一种沟通方式可以解释我遇到的问题? 但是,这不是消息系统的全部意义……能够在视图模型之间进行通信吗? 或者我可以强制视图模型在启动时实例化吗? 如果是这样,那将如何影响ViewModelLocator ? 我希望我已经清楚地概述了这个问题,为了解释的目的,我使用了虚构的视图模型名称…请随时编辑或建议您希望我添加的任何其他信息!

MVVM Light – 用户控件作为视图

我决定使用MVVM Light库来帮助设计UI。 经过大量的研究和反复试验,我还没有找到我想要的答案。 我用谷歌搜索并阅读了我能找到的每个StackOverflow问题,然而,我的问题似乎在SO上是独一无二的。 我希望设计一个带有单个窗口的UI,并使用不同的Views / UserControls填充它。 我不想在UserControls中使用共享导航栏,也不想弹出多个窗口。 每个View / UserControl都应绑定到自己的ViewModel,而MainWindow将绑定到MainViewModel。 示例场景 – 具有3个UserControl的MainWindow 1. MainWindow populates with first UserControl which has a listbox and 3 buttons, the first button is enabled. 2. User clicks the first button. 3. MainWindow populates with second UserControl. 或者,另外 2. User selects choice from a listbox, button two and […]