GVKun编程网logo

silverlight – MVVM Light,Windows Phone,View和ViewModel页面之间的导航(页面与导航的间距)

1

以上就是给各位分享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页面之间的导航(页面与导航的间距)

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分配新创建的视图模型,但我认为这样做并不是很好.
建议?

解决方法

我看到你使用Messenger类发送消息,因此你熟悉MVVM中的消息传递.您必须定义自己的消息类型,该类型应接受第1页的参数:

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 鼠标双击事件

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

Mvvm-Light Silverlight,使用EventToCommand和Combobox

我将视图模型中的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>

在我看来,

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没有经验,所以我觉得我真的很想念这里的东西.谁能帮忙?提前致谢!

解决方法

在做一些挖掘之后,我发现将实际的SelectionChangedEventArgs作为ICommand的execute参数传递很简单:

只要设置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文件

mvvm-light – 在Windows Phone MVVM应用程序中播放/暂停mp3文件

我试图在我的 Windows Phone 7.5 MVVM应用程序中播放小型mp3文件(使用MVVM Light).

我在尝试:

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视图来说并不好.

如何解决这个问题?

解决方法

在MVVM样式中实现此目的的一种方法是使用MVVM Light Messenger类从viewmodel发送播放/暂停消息,视图将订阅和接收该消息.

假设您在播放和暂停视图中有一对按钮.您将在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

如何解决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项目中拥有所有视图模型。     

解决方法

        查看这些博客: http://www.davidezordan.net/blog/?p=1734, http://www.davidpoll.com/2010/02/01/on-demand-loading-of-assemblies-with-silverlight-navigation-revisited-for-silverlight-4-beta/     

今天关于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等相关知识,可以在本站进行查询。

本文标签: