以上就是给各位分享silverlight–MVVMLight,WindowsPhone,View和ViewModel页面之间的导航,其中也会对页面与导航的间距进行解释,同时本文还将给你拓展MVVMSi
以上就是给各位分享silverlight – MVVM Light,Windows Phone,View和ViewModel页面之间的导航,其中也会对页面与导航的间距进行解释,同时本文还将给你拓展MVVM Silverlight 5 Datagrid MVVM 鼠标双击事件、Mvvm-Light Silverlight,使用EventToCommand和Combobox、mvvm-light – 在Windows Phone MVVM应用程序中播放/暂停mp3文件、Silverlight + Galasoft MVVM Light + MEF加载XAP等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- silverlight – MVVM Light,Windows Phone,View和ViewModel页面之间的导航(页面与导航的间距)
- MVVM Silverlight 5 Datagrid MVVM 鼠标双击事件
- Mvvm-Light Silverlight,使用EventToCommand和Combobox
- mvvm-light – 在Windows Phone MVVM应用程序中播放/暂停mp3文件
- Silverlight + Galasoft MVVM Light + MEF加载XAP
silverlight – MVVM Light,Windows Phone,View和ViewModel页面之间的导航(页面与导航的间距)
使用MVVM Light工具包,我有一个viewmodel绑定到第一页的视图.当用户点击按钮时,它会重定向到另一个视图,这将是第二页
即:
Page2Command = new DelegateCommand((obj) => Messenger.Default.Send<Uri>(new Uri("/DoStuffView.xaml",UriKind.Relative),Common.CommonResources.GoTodoStuffRequest)) });
问题是,第二个视图的视图模型(我看到它的方式)在构造函数中有几个参数,它们基本上是在第一页上设置的配置的依赖项.
即:
public DoStuffviewmodel(ICollection<Note> availableNotes,SoundMappers soundType) { }
问题出在这里..如何用第一页上用户动态选择的数据实例化viewmodel?
我无法使用MVVM光提供的viewmodelLocator模式,因为这些视图模型没有任何依赖关系,它们只是它们自己(或者它们可以从数据库,文件或其他任何方式检索数据,但它们没有任何动态输入数据).我可以通过视图的构造函数来实现它,在那里实例化viewmodel,并为视图的DataSource分配新创建的视图模型,但我认为这样做并不是很好.
建议?
解决方法
public class Page2viewmodelCreateMessage : MessageBase { public ICollection<Note> AvailableNotes{get;set;} public SoundMappers SoundType{get;set;} public Page2viewmodelCreateMessage () { } public Page2viewmodelCreateMessage(ICollection<Note> availableNotes,SoundMappers soundType) { this.AvailableNotes = availableNotes; this.soundType = soundType; } }
您必须使用参数发送Page2viewmodelCreateMessage实例并在导航时发送它:
var message = new Page2viewmodelCreateMessage(myAvailableNotes,mySoundType) Messenger.Default.Send(message);
在Page2上,您必须注册接收类型为Page2viewmodelCreateMessage的消息:
Messenger.Default.Register<Page2viewmodelCreateMessage>(this,OnPage2viewmodelCreateMessage); .. public void OnPage2viewmodelCreateMessage(Page2viewmodelCreateMessage message) { var page2viewmodel = new Page2viewmodel(messsage.AvailableNotes,message.soundType); }
正如您所看到的,我已使用Page2viewmodel替换您的DoStuffviewmodel以使其更清晰.
我希望这能帮到您.
注意:我不保证代码将在记事本中写入.
MVVM Silverlight 5 Datagrid MVVM 鼠标双击事件
近日在Silverlight 5中用到了要在Datagrid鼠标双击事件 ,本来很多学习资料 但是由于用的是MVVM模式。所以一开始一头雾水,后来用了比较简便的方式予以实现,仅供参考,也请各位大侠指点。
具体代码见下:
1、页面XAML代码
<sdk:DataGridTextColumn Binding="{Binding UpdateDate }" Header="更新时间" />
</sdk:DataGrid.Columns>
//触发器
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonUp" >
<cmd:EventToCommand Command="{Binding OpenEditwindowCommand}"
CommandParameter="{Binding SelectedItem,ElementName=dgMembers}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</sdk:DataGrid>
当然要添加引用:
xmlns:cmd="clr-namespace:galaSoft.MvvmLight.Command;assembly=galaSoft.MvvmLight.Extras.SL5"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
2、viewmodel代码
private DateTime _clickTs;
#region Command定义
public ICommand OpenEditwindowCommand { get; private set; }
#endregion
public Testviewmodel()
{
_clickTs = DateTime.Now;
OpenEditwindowCommand = new RelayCommand<object>(OpenEditwindow);
}
private void OpenEditwindow(object obj)
{
DateTime Now = DateTime.Now;
if (Now.Subtract(_clickTs).TotalMilliseconds <= 200)//此处的时间都是毫秒哦
{
//此处添加您要实现的功能.
}
else
{
_clickTs = Now;
}
}
Mvvm-Light Silverlight,使用EventToCommand和Combobox
<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>
在我看来,
public ICommand SelectCategoryCommand { get { return new SelectCategoryCommand(this); } } public CategoryType SelectedCategory { get; set; }
和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) { CategoryType categoryType = (CategoryType) parameter; } }
但是,ICommand的Execute方法中的参数始终为空.我对SilverLight没有经验,所以我觉得我真的很想念这里的东西.谁能帮忙?提前致谢!
解决方法
只要设置PassEventArgsToCommand =“True”
<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}" MustToggleIsEnabledValue="True" PassEventArgsToCommand="True"/> </i:EventTrigger> </i:Interaction.Triggers> </ComboBox>
然后在Execute方法中执行以下操作:
public void Execute(object parameter) { SelectionChangedEventArgs e = (SelectionChangedEventArgs)parameter; CategoryType categoryType = (CategoryType)e.AddedItems[0]; }
mvvm-light – 在Windows Phone MVVM应用程序中播放/暂停mp3文件
我在尝试:
1.要使用SoundEffect:
SoundEffectInstance instance; SoundEffect effect = SoundEffect.FromStream(stream); instance = effect.CreateInstance(); Frameworkdispatcher.Update(); instance.Play();
问题:只允许使用.wav文件.
第2位.要使用Microsoft.Xna.Framework.Media.song:
Microsoft.Xna.Framework.Media.song song = Microsoft.Xna.Framework.Media.song.FromUri("name",new Uri("someUri"));
问题:文件存储在IsolatedStrorage中,我们需要知道文件的完整路径.
建议提示:
string path = stream.GetType().GetField("m_FullPath",BindingFlags.Instance | BindingFlags.NonPublic).GetValue(stream).ToString();
不管用.
3D.使用标准MediaElement.
问题:我需要访问viewmodel中的MediaElement控件,这对MVVM视图来说并不好.
如何解决这个问题?
解决方法
假设您在播放和暂停视图中有一对按钮.您将在Expression Blend中删除每个上的EventToCommand behavior,然后将它们绑定到viewmodel中的一对RelayCommand属性,一个用于Play的RelayCommand,一个用于Pause.例如,在您的viewmodel中,您将拥有:
public RelayCommand PlayCommand { get; private set; } public RelayCommand PauseCommand { get; private set; }
Play命令会让Messenger发送Play消息,Pause命令会发送Pause消息.每条消息都是它自己的简单类:
public class PlayMessage { } public class PauseMessage { }
然后,在viewmodel的构造函数中,您将为之前创建的两个RelayCommand属性创建新的RelayCommands,这些属性将具有Messenger发送消息的操作:
Myviewmodel() { PlayCommand = new RelayCommand( () => SendplayMessage() ); PauseCommand = new RelayCommand( () => SendPauseMessage() ); } private void SendplayMessage() { Messenger.Default.Send<PlayMessage>( new PlayMessage() ); } private void SendPauseMessage() { Messenger.Default.Send<PauseMessage>( new PauseMessage() ); }
那么你的视图将是have the Messenger subscribe到这两种消息类型,并且会有一些操作可以调用MediaElement上的Play和Pause方法:
MyView() { Messenger.Default.Register<PlayMessage> ( this,( action ) => ReceivePlayMessage( action ) ); Messenger.Default.Register<PauseMessage> ( this,( action ) => ReceivePauseMessage( action ); ); } private void ReceivePlayMessage(PlayMessage msg) { myMediaElement.Play(); } private void ReceivePauseMessage(PauseMessage msg) { myMediaElement.Pause(); }
myMediaElement是您在视图的xaml中为MediaElement提供的名称.
Silverlight + Galasoft MVVM Light + MEF加载XAP
如何解决Silverlight + Galasoft MVVM Light + MEF加载XAP
|| 我有一个可以说有一些“模块”的应用程序。 每个用户都有查看每个模块的权限,有些则看不到所有,有些则看到全部。 我想加载XAP文件并在我的应用程序中加载那些视图模型(带有视图)。 如何使用galasoft MVVM light和DeploymentCatalogService做到这一点? 参考: http://mvvmlight.codeplex.com/ http://codebetter.com/glennblock/2010/03/08/building-hello-mef-part-iv-deploymentcatalog/ 甚至可能吗?还是我在这里浪费时间?如何在定位器中初始化它? 因此,让我在此示例用户案例中对此进行解释: 用户登录 应用程序根据用户权限(用户模块,组模块,商品模块,客户模块,计费模块等)加载XAP文件= viewmodel + Views 用户单击其中一个模块,即可启动viewmodel 用户使用应用程序并感到高兴 我目前在一个Silverlight项目中拥有所有视图模型。解决方法
今天关于silverlight – MVVM Light,Windows Phone,View和ViewModel页面之间的导航和页面与导航的间距的分享就到这里,希望大家有所收获,若想了解更多关于MVVM Silverlight 5 Datagrid MVVM 鼠标双击事件、Mvvm-Light Silverlight,使用EventToCommand和Combobox、mvvm-light – 在Windows Phone MVVM应用程序中播放/暂停mp3文件、Silverlight + Galasoft MVVM Light + MEF加载XAP等相关知识,可以在本站进行查询。
本文标签: