我想开始一系列MVVM-light(w/RIA Services)最佳实践.我发现有很多项目是有用的最佳实践或最佳方法,但是希望听到其他人使用MVVM-light工具包并查看他们发现的内容.
请将您的最佳做法发布为此问题的答案.
我正在尝试使用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 = new ConversationViewModel();
conversation.Messages.Add(new MessageViewModel { Image = img, Text = "Share" });
main1.Conversations.Add(conversation); // error InvalidCastException
main2.Conversations.Add(conversation); // no error
Run Code Online (Sandbox Code Playgroud)
img新创建的BitmapImage 在哪里
ViewModelLocator
public class ViewModelLocator
{ …Run Code Online (Sandbox Code Playgroud) 是否有MVVM方式在文本框中选择文本?我使用的MVVM框架是Laurent Bugnion的MVVM Light Toolkit.
我已经在我的视图模型中将ComboBox的SelectedItemChangeEvent连接到ICommand.一切似乎工作正常,但我不知道如何获得ComboxBox的SelectedItem.我想我需要使用EventToCommand的CommandParameter - 我将它绑定到我的ViewModel中具有ComboBox的selectedItem的东西吗?我试过这个:
<ComboBox
Width="422"
Height="24"
DisplayMemberPath="Name"
ItemsSource="{Binding CategoryTypes}"
SelectedItem="{Binding SelectedCategory}"
>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<MvvmLight:EventToCommand
Command="{Binding SelectCategoryCommand,Mode=TwoWay}"
CommandParameter="{Binding SelectedCategory, Mode=TwoWay}"
MustToggleIsEnabledValue="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
在我的视图模型中:
public ICommand SelectCategoryCommand
{
get
{
return new SelectCategoryCommand(this);
}
}
public CategoryType SelectedCategory
{
get; set;
}
Run Code Online (Sandbox Code Playgroud)
和ICommand
public class SelectCategoryCommand : ICommand
{
private RowViewModel _rowViewModel;
public SelectCategoryCommand(RowViewModel rowViewModel)
{
_rowViewModel = rowViewModel;
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用L. Bugnion的MVVM Light Framework.
将客户ID等参数传递给ViewModel构造函数的一些推荐方法是什么?
编辑:每个ViewModel所需的参数不是跨模型共享的参数.它是每个viewmodel实例独有的东西.
我一直在看mvvm轻工具包,我必须承认我没有很多经验,但我住我所看到的..
我确实使用了mvvm工具包(微软)但目前使用的是vs 2010,目前尚无模板可用.
我正在寻找对mvvm light toolkit的一些见解......
它总是保持?我......它明天不会消失......
或者shoudl我在寻找其他地方?
我真的很感激任何反馈......
我还看到了一些关于mvvm工具包(微软)似乎没有的可混合性的信息.
Prism似乎也是一个可能的候选者,但据我所知它不是MVVM框架/工具包
我将使用它与wpf
任何帮助真的很感激
谢谢
我克隆了一个解决方案,它包含基于GalaSoft MvvmLight库的多个项目,还有两个Portable项目.我已经安装了所有必需的nuget包和引用,但我无法构建这些可移植项目,并且需要首先构建这些可移植项目,因为所有其他项目都引用它.
我在使用GalaSoft的每个文件中都出现了这个(下面)错误.它是一个Portable类库项目.
错误64找不到类型或命名空间名称'GalaSoft'(您是否
缺少using指令或程序集引用
我在这个项目中引用了这个(下面)Portable MvvmLight库
\MvvmLightLibs.4.4.32.7\lib\netcore45\GalaSoft.MvvmLight.dll
\MvvmLightLibs.4.4.32.7\lib\netcore45\GalaSoft.MvvmLight.Extras.dll
Run Code Online (Sandbox Code Playgroud)
这是平台目标

我试过清理并重新启动visual studio.我现在被困在这个问题超过2天了.此外,我已经尝试检查并取消选中Configuration Manager中的"Build"选项(我已经在某处阅读过)但是没有用.
此外,还有其他44个警告.所有这些看起来都类似于下面的警告.
警告28主要参考"GalaSoft.MvvmLight"无法解析,
因为它对框架程序集"System.Linq.Expressions,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"具有间接依赖性,无法解析在目前有针对性的框架中." .NETPortable,版本= V4.0,外形= Profile158" .要解决此问题,请删除引用"GalaSoft.MvvmLight"或将应用程序重新定位到包含"System.Linq.Expressions,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"的框架版本.
编辑: 问题标题修订
我正在构建一个基于MVVM-Light的应用程序.我需要创建同一个View的多个实例,每个实例都应绑定到自己的ViewModel.
默认情况下将ViewModelLocatorViewModels实现为单例,因此同一View的不同实例将绑定到同一ViewModel.
我可以在VMLocator中创建ViewModel作为非静态对象(就像返回新VM()...一样简单),但这只会对我有所帮助.事实上,我仍然需要跟踪打开的窗口.然而,每个窗口可能会打开其他几个窗口(不同类型).在这种情况下,我可能需要在父View及其所有子项上执行一些操作.例如,在关闭View P之前,我可能想要关闭它的所有子节点(视图C1,视图C2等).
因此,有没有简单易行的方法来实现这一目标?或者你有什么建议我遵循的最佳做法?
提前感谢您的宝贵帮助.
干杯,
Gianluca.
我在视图中的一个按钮,绑定到ViewModel的ICommand属性(实际上它是来自mvvv-light的RelayCommand)
如果用户点击按钮,我想导航到新视图.当然,NavigationService是View而不是ViewModel的一部分.这意味着导航是View的责任?但在我的情况下,单击按钮时我将要查看的视图取决于很多因素,包括登录用户是谁,数据库所处的状态等等......当然,视图不需要全部那些信息.
执行NavigationService.Navigate调用的首选选项是什么?
从代码隐藏中很容易做到这一点:
var button = new Button();
var margin = button.Margin;
margin.Right = 10;
button.Margin = margin;
Run Code Online (Sandbox Code Playgroud)
但是,在XAML中,我仅限于以下内容:
<Button Margin="0,0,10,0" />
Run Code Online (Sandbox Code Playgroud)
这个问题是,现在我可能通过将其设置为零来覆盖其他边距值(即左边,上边,下边).
有没有办法让XAML像下面那样?
<Button MarginRight="10" />
Run Code Online (Sandbox Code Playgroud) mvvm-light ×10
mvvm ×6
c# ×4
wpf ×4
silverlight ×3
.net ×2
selecteditem ×1
textbox ×1
viewmodel ×1
windows-8 ×1
wpf-controls ×1
xaml ×1