【问题标题】:How do i design a composite view and view model using Silverlight and MVVM?如何使用 Silverlight 和 MVVM 设计复合视图和视图模型?
【发布时间】:2023-03-04 23:52:01
【问题描述】:

我想在我的 Silverlight MVVM 应用程序中创建一个“向导”。该向导应包含多个步骤,您可以使用“下一个”和“上一个”在这些步骤之间导航。 我面临的问题是视图和视图模型之间的关系。 我希望向导本身有一个视图和视图模型。我的直觉告诉我,向导中的每个步骤都应该有一个视图/视图模型对。

什么是维护这些关系的好方法,其中一个视图模型包含多个其他视图模型,而该视图实际上由几个较小的视图组成? 有什么我可以使用的模式或做法吗?

我知道这个问题可能是主观的,但请给我一个粗略的方法,我会给你一个答案!

【问题讨论】:

    标签: silverlight mvvm view viewmodel


    【解决方案1】:

    我建议主向导 viewModel 具有 steps 视图模型的集合并处理它们之间的导航。导航时应该调用step viewModels 中的验证方法:

    向导虚拟机:

    public class WizardVM
    {
         // this commands should support CanExecute
         public ICommand GotoNextCommand { get; private set; } // should open next step VM
         public ICommand GotoBackCommand { get; private set; } // should open previous step VM
    
         // this prop should be set by 'GotoNext', 'GotoBack' commands
         public object CurrentStep { get; private set; }
    
         // probably internally you will have a list of all steps:
         private ICollection<object> _stepViewModels = ...;
    }
    

    向导视图:

    <StackPanel>
        <ContentPresenter Content="{Binding CurrentStep}">
        <StackPanel Orientation="Horizontal">
            <Button Command="{Binding GotoBackCommand}">Back</Button>
            <Button Command="{Binding GotoNextCommand}">Next</Button>
        </StackPanel>
    </StackPanel>
    

    更新

    视图可以通过Datatemplating 与 ViewModel 耦合。例如将其添加到App.Xaml中的资源中:

    <DataTemplate DataType="{x:Type local:Step1ViewModel}">
         <Step1View />
    </DateTemplate>
    <DataTemplate DataType="{x:Type local:Step2ViewModel}">
         <Step2View />
    </DateTemplate>
    

    您的 viewModel 应该对视图一无所知。这意味着WizardVM 应该 仅公开其他视图模型,但不公开视图。这是 MVVM 的经验法则。

    UPDATE2 糟糕,我忘记了 Silverlight 还没有 DataTemplating。在 silverlight 中,我仍然会公开 ViewModel,但使用转换器将它们绑定到 ContentPresenters,该转换器会将 viewModel 转换为相应的视图。

    【讨论】:

    • 哇,真快!但是......我很好奇,你认为 CurrentStep 属性应该是可见的(即视图)吗?否则我看不到 ContentPresenter 将如何呈现它。我的问题是将包含的视图和视图模型相互连接。
    • @Per, CurrentStep 应该公开 Step ViewModel。查看更新的答案
    • 好的...使用值转换器将视图模型转换为视图。这很具有操纵性,嗯.. 我的意思是务实:) 但是,这是一种我没想到的新方法!我怀疑这就是我要追求的目标,但我会奖励你即使超越我自己(相当操纵)本性的创新……感谢您抽出宝贵时间回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多