WPF,MVVM和应用程序范围的资源最佳实践

时间:2015-09-29 05:53:09

标签: wpf mvvm inotifypropertychanged

我目前正在编写一个WPF应用程序,其左侧有一个导航面板(我绑定了一个navigationViewModel),右侧有一个内容展示器(我绑定到前面提到的VM的UserControl成员'CurrentView'。 对于此导航面板的每个项目,我创建了一个相应的用户控件,对于每个用户控件,我绑定了相应ViewModel的实例。

单击导航面板的项目,将其ViewModel的UserControl成员CurrentView设置为相应UC的实例,然后显示在上述内容呈现器中。

第一个导航项是“选择或创建新客户”表单。完成此操作后,我想设置一些宽的应用程序资源ID,我将绑定其他导航项启用状态。因此,如果宽应用程序资源为null,则禁用它们,只要它设置为任何内容,它们就会被启用。还有一些机制可以让相应的ViewModel得到这种情况的通知。

我想知道这是否算是一种好习惯? 此外,我想知道我是否可以简单地在app.xaml中声明一个int资源并将其绑定到导航项Enabled属性,将此资源设置为任何立即刷新此属性的东西?还是有更好,更简单或更清洁的方式?

2 个答案:

答案 0 :(得分:1)

另一种方法是将两个视图模型(navigation和currentview)嵌套在第三个视图模型中(比如mainviewmodel)

然后,这个主视图模型可以保持应该在这些视图模型和当前视图的实例之间可用的状态。

这样您就不需要在应用程序中拥有全局状态,只需将Window的datacontext设置为主视图模型,并将导航视图和内容视图绑定到主视图模型的属性。

这也使您可以在适当的位置导航到不同的内容视图。

答案 1 :(得分:0)

这是我最终做的事情:

在我的app.xaml中;我声明了以下资源:

<Application x:Class="MyProject.GUI.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:MyProject.GUI.ViewModels"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <vm:MainViewModel x:Key="MainViewModel" />
    </Application.Resources>
</Application>

此MainViewModel公开一个静态属性,如下所示:

static bool _myStaticProperty;
public static bool MyStaticProperty
{
    get
    {
        return _myStaticProperty;
    }
    set
    {
        _myStaticProperty = value;
        NotifyStaticPropertyChanged("MyStaticProperty");
    }
}

以下静态INPC机制:

#region Static property INPC mechanism
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
static void NotifyStaticPropertyChanged(string propertyName)
{
    if (StaticPropertyChanged != null)
    {
        StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName));
    }
}
#endregion       

我不同的视角模型:

FirstChildViewModel _firstChildViewModel;
public FirstChildViewModel FirstChildViewModel
{
    get
    {
        if (_firstChildViewModel == null)
            _firstChildViewModel = new FirstChildViewModel();
        return _firstChildViewModel;
    }
}
//then a second one, a third one and so on

哪些绑定到我的用户控件,如下所示

<UserControl x:Class="MyProject.GUI.Views.FirstChildControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:MyProject.GUI.ViewModels"
         mc:Ignorable="d"
         DataContext="{Binding Path=FirstChildViewModel,
                               Source={StaticResource MainViewModel}}">

在我的用户控件中&#39; xaml代码,我声明命令绑定等,它们在ViewModel中基本上执行以下操作

MainViewModel.MyStaticProperty = myBoolValue;