使用MVVM的UWP App:在主视图上注册功能视图

时间:2017-07-28 16:41:42

标签: c# xaml mvvm uwp feature-driven

我是c#和uwp应用的新手。这是我第一次使用MVVM。 我有以下程序设计,并根据FDD的架构。 MVVM App-Design

我想实现:

  • 在ViewMain.xaml上注册ViewFeature.xaml
  • 功能之间的沟通。

我有以下简单的方法:通过代码将ViewFeature.xaml添加到ViewMain.xaml,但遗憾的是,目前无效。

  • 查看注册:

MainView.xaml

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:Client.ViewModel"
x:Class="Client.View.ViewMain"
mc:Ignorable="d">

<Grid x:Name="ContentGrid" RequestedTheme="Light">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <StackPanel Name="FeatureLeft"      Orientation="Horizontal" Grid.Column="0"/>
    <StackPanel Name="FeatureCenter"    Orientation="Horizontal" Grid.Column="1"/>
    <StackPanel Name="FeatureRight"     Orientation="Horizontal" Grid.Column="2"/>
</Grid>
</Page>

ViewMain.xaml.cs

public sealed partial class ViewMain : Page
{

    public ViewModelMain viewModelMain;

    public ViewMain()
    {           
        this.InitializeComponent();
        viewModelMain = new ViewModelMain();
        viewModelMain.RegisterFeatures(this);        
    }
}

ViewModelMain.cs

public class ViewModelMain: NotificationBase
{
    public ModelMain model;
    public ViewModelMain()
    {
        model = new ModelMain();
        _Features = model.LoadFeatures();
    }

    public void RegisterFeatures(Page p)
    {
        foreach (var feature in _Features)
        {
            feature.AddToView(p);
        }
    }

    ObservableCollection<IViewFeature> _Features = new ObservableCollection<IViewFeature>();
    public ObservableCollection<IViewFeature> Features {
        get { return _Features; }
        set { SetProperty(ref _Features, value); }
    }

}

ModelMain.cs

public class ModelMain
{

    public ObservableCollection<IViewFeature> FeatureList;


    public ObservableCollection<IViewFeature> LoadFeatures()
    {
        FeatureList = new ObservableCollection<IViewFeature>();
        IViewFeature galleryFeature = new Gallery.View.ViewGallery();
        FeatureList.Add(galleryFeature);

        return FeatureList;
    }

}

每个功能都知道自己在ViewMain.xml上的位置,并在ViewFeaure.xaml.cs中实现以下方法在ViewMain.xaml上注册自己的ViewFeature.xaml

public void AddToView( Page p)
    {
        StackPanel target = (StackPanel)p.FindName("FeatureLeft");
        target.Children.Add(this);
    }

任何专业的方法或帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

问题在于这一行。

target.Children.Add(this);

应该是

target.Children.Add(this as UIElement);

但是,我仍然想知道基于特征的应用程序的专业方法如何在特征驱动开发(FDD)的背景下看待。