我在我的项目中有多个视图,并希望它们从一个处理某些导航逻辑的基类派生.这个逻辑不属于VM,所以我将它放在View中.
现在,当我试图更改视图的基类时,我收到以下错误:
"ProjectName.Results"的部分声明不得指定不同的基类.
我唯一改变的是:
public partial class Results : PhoneApplicationPage
Run Code Online (Sandbox Code Playgroud)
至:
public partial class Results : BaseView
Run Code Online (Sandbox Code Playgroud)
我在项目中找不到任何其他结果类的删除.也许MVVMLight在构建时会产生一些东西.
是否可以让视图派生自基类?它应该是,但我不能让它工作.
我正在使用MVVMLight并经历一些学习曲线,试图找出通信的工作原理.我理解Properties如何与Silverlight绑定一起工作,这一切都很简单.
现在我想知道的是发送Message as a Command的最佳方法是什么.因此,例如,我想向我的ViewModel发送一条消息以清除其列表.
所以我可以创建一个枚举来充当命令
enum MessageOp
{
Reset
}
Run Code Online (Sandbox Code Playgroud)
但是,我怎么能把它作为命令发送?目前我发送它作为类,但然后需要再次作为令牌发送它.像这样:
Messenger.Default.Send<MessageOp>(MessageOp.Reset, MessageOp.Reset);
Run Code Online (Sandbox Code Playgroud)
我在ViewModel中的代码是这样的:
Messenger.Default.Register<MessageOp>(
this, MessageOp.Reset,
delegate(MessageOp op)
{
// Erase all entries
MyDictionary.Clear();
});
Run Code Online (Sandbox Code Playgroud)
我想到的一种方法是创建一个完全空的类来充当命令.这是最好的方法,因为我觉得有点奇怪创建空类来表现这样
这适用于WP7.我在列表框itemtemplate中有一个按钮.在关联的ViewModel中,我有RelayCommand,它已经绑定到Button的Click事件(使用MVVMLight EventToCommand).我想要的只是在单击按钮时传入ListBox的ListItem.
有任何想法吗?
我正在开发一个基于mvvm light toolkit的项目.我有一个MainView和一个DetailsView相应的ViewModels.两个虚拟机都注册了NotificationMessage.
// MainViewModel.cs and DetailsViewModel.cs
private void RegisterMessages()
{
Messenger.Default.Register<NotificationMessage>(this, NotificationMessageHandler);
}
Run Code Online (Sandbox Code Playgroud)
收到"ShowDetails"消息时,MainViewModel调用创建"DetailsView"的服务
// MainViewModel.cs
private void NotificationMessageHandler(NotificationMessage msg)
{
if (msg.Notification == "ShowDetails")
{
_detailsService.ShowDetails(); // Does something like (new DetailsView).ShowDialog()
}
}
Run Code Online (Sandbox Code Playgroud)
的DetailsView用途ViewModelLocator,以获得现有DetailsViewModal的DataContext的.
在DetailsViewModel应该接收"ShowDetails"消息来更新其内部状态或要求的一些数据,也.
// DetailsViewModel.cs
private void NotificationMessageHandler(NotificationMessage msg)
{
if (msg.Notification == "ShowDetails")
{
UpdateViewModel();
}
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:因为我希望它DetailsView是一个模态窗口,我会调用ShowDialog()它.这似乎阻止了信使,直到DetailsView再次关闭.因此,DetailsViewModal在模态窗口关闭后接收消息.有没有解决方法可以解决这个问题?
如果我能在DetailsViewModal …
我在一个用DataTemplate设计的ObservableCollection中暴露了一个Model类,其中处理了Model的proeprty绑定.
当我手动在Model类中实现INotifyPropertyChanged接口时,ObservableCollection中的绑定proeprty不会自动更改,而只是在重新呈现集合之后.
当我从ViewModelBase(MVVM Light工具包类)继承并使用RasiePropertyChanged方法时,绑定属性会自动更改而不刷新整个集合.
除了实现INotifyPropertyChanged接口之外,ViewModelBase做了什么?
我正在尝试为MVVMLight WPF重新配置我的MVVMLight SL5应用程序.
我想我已经连接了所有正确的GalaSoft库,但在启动时我得到了标题中显示的异常.
获取MainPage的ViewModel时,它出现在ViewModelLocator中:
public MainViewModel Main
{
get
{
MainViewModel mvm = null;
try
{
mvm = ServiceLocator.Current.GetInstance<MainViewModel>();
}
catch (Exception xx)
{
System.Diagnostics.Debug.WriteLine(xx.Message);
}
return mvm;
}
}
Run Code Online (Sandbox Code Playgroud)
例外来自GetInstance()调用.
MainPage源自Window; DataContext在xaml中设置.
DataContext="{Binding Main, Source={StaticResource Locator}}"
Run Code Online (Sandbox Code Playgroud)
任何关于出错的提示都将不胜感激....(目标.Net 4.5,GalaSoft WPF4 libs v4.0.30319)
我正在尝试将MvvmLight Toolkit安装到我的Visual Studio中.我有一个VSIX文件,如下所示 -

当我尝试打开它(通过双击)时,它要求我选择一个程序打开...
像这样..

我不知道该怎么做.
有人能告诉我如何使用vsix文件安装MvvmLight吗?我正在使用Visual Studio Ultimate 2012.
我需要在我的视图模型中使用FolderBrowserDialog的结果,
CodeBehind.cs
private static void SelectFolderDialog()
{
using (System.Windows.Forms.FolderBrowserDialog folderdialg = new System.Windows.Forms.FolderBrowserDialog())
{
folderdialg.ShowNewFolderButton = false;
folderdialg.RootFolder = Environment.SpecialFolder.MyComputer;
folderdialg.Description = "Load Images for the Game";
folderdialg.ShowDialog();
if (folderdialg.SelectedPath != null)
{
var notifypath = new GenericMessage<string>(folderdialg.SelectedPath);
Messenger.Default.Send(notifypath);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在计划的是,从View-model发送带回调的通知到视图,执行FolderBrowserDialog将Selected路径返回给视图模型.
如何使用MVVM-Light发送带回调/ NotificationWithAction的notificationmessage.请帮我一个样本,因为我是Wpf和MVVM-Light的新手.
任何帮助表示赞赏
我创建了一个小的文件浏览器控件:
<UserControl x:Class="Test.UserControls.FileBrowserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="44" d:DesignWidth="461" Name="Control">
<Grid Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Margin="3" Text="{Binding SelectedFile}" IsReadOnly="True" TextWrapping="Wrap" />
<Button HorizontalAlignment="Right" Margin="3" Width="100" Content="Browse" Grid.Column="1" Command="{Binding BrowseCommand}" />
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
使用以下代码:
public partial class FileBrowserControl : UserControl
{
public ICommand BrowseCommand { get; set; }
//The dependency property
public static DependencyProperty SelectedFileProperty = DependencyProperty.Register("SelectedFile",
typeof(string),typeof(FileBrowserControl), new PropertyMetadata(String.Empty));
public string SelectedFile { get{ return (string)GetValue(SelectedFileProperty);} set{ SetValue(SelectedFileProperty, value);}}
//For my first test, this is …Run Code Online (Sandbox Code Playgroud) 我需要使用创建时传递给ViewModel的特定参数来创建ViewModel的实例。同时,此ViewModel实例应在SimpleIOC中注册
我认为这是解决问题的方法:
SimpleIoc.Register<TClass> Method (Func<TClass>, String, Boolean)
Run Code Online (Sandbox Code Playgroud)
将设置true为最后创建的最后一个参数。因此,如果我正确理解,则此方法希望引用将创建我的ViewModel实例的方法。
看起来这叫做ClassFactory。
我尝试自己做,但我得到的只是
cannot convert from <Class> to System.Func<Class>
Run Code Online (Sandbox Code Playgroud)
因此似乎即时传递的总是类的实例,而不是应该创建该类的方法。
有人可以举一个简短的例子,我如何使它工作
public class ClassFactory
{
public ChatWindow CreateChatWindow(RosterItemX ri)
{
return new ChatWindow(ri);
}
}
public class ViewModelLocator
{
.
.
.
.
public static void CreateWindow(RosterItemX riv)
{
ClassFactory cf = new ClassFactory;
SimpleIoc.Default.Register<ChatWindow>(cf.CreateChatWindow(ri), "key", true )
var _messageWindow = new MessageWindow();
_messageWindow.Show();
}
}
class ChatMessage
{
RosterItemX ri = new RosterItemX();
ViewModelLocator.CreateWindow(ri);
}
Run Code Online (Sandbox Code Playgroud)