/**************************************************************************
*
* =================================
* CLR版本 :4.0.30319.42000
* 命名空间 :ToDoStylet
* 文件名称 :StudentViewManager.cs
* =================================
* 创 建 者 :LQZ
* 创建日期 :2019-8-14 14:54:05
* 功能描述 :
* =================================
* 修 改 者 :
* 修改日期 :
* 修改内容 :
* =================================
*
***************************************************************************/
using Stylet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace ToDoStylet
{
///
/// 自定义特性,用于跨项目绑定前后台
///
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)]
sealed class ViewModelAttribute : Attribute
{
readonly Type viewModel;
public ViewModelAttribute(Type viewModel)
{
this.viewModel = viewModel;
}
public Type ViewModel
{
get { return viewModel; }
}
}
///
/// 绑定view与viewmodel
///
public class BaseViewManager : ViewManager
{
// 用于存储viewmodel与view类型的字典;Dictionary of ViewModel type -> View type
private readonly Dictionary viewModelToViewMapping;
public BaseViewManager(ViewManagerConfig config)
: base(config)
{
var mappings = from type in this.ViewAssemblies.SelectMany(x => x.GetExportedTypes())
let attribute = type.GetCustomAttribute()
where attribute != null && typeof(UIElement).IsAssignableFrom(type)
select new { View = type, ViewModel = attribute.ViewModel };
this.viewModelToViewMapping = mappings.ToDictionary(x => x.ViewModel, x => x.View);
}
//根据viewmodel定位view
protected override Type LocateViewForModel(Type modelType)
{
Type viewType;
if (!this.viewModelToViewMapping.TryGetValue(modelType, out viewType))
throw new Exception(String.Format("Could not find View for ViewModel {0}", modelType.Name));
return viewType;
}
}
}