gpt4 book ai didi

c# - 使用MEF,如何导出ItemsControl的 View ?

转载 作者:行者123 更新时间:2023-12-03 11:00:11 26 4
gpt4 key购买 nike

enter code here标题可能不是那么具体。

我遇到的情况是。我有一个ItemsControl,其中插入了许多ViewModels,并且此ItemsControl应该必须通过View显示DataTemplates

因此,我将它们写在ResourceDictionary中:

然后,我将此ResourceDictionary添加到ApplicationResources中。

这是如此多余和累人。

我也在使用MVVM,因此我在考虑是否可以使用MEF来发现应该绘制的相应View。我当时正在研究创建一个自定义属性标签来简化这些冗余代码是一个好主意,也许在 View 中添加此标签以告诉它该ViewModel应该为此 View 绘制,但我对MEF迷失了。

计划是删除ResourceDictionary

你能帮我一下吗?

提前致谢。

最佳答案

[System.ComponentModel.Composition.InheritedExport(typeof(ProblemView))]
public abstract class ProblemView : UserControl // or whatever your Views inherit
{
public abstract Type ViewModelType { get; }
}

[System.ComponentModel.Composition.InheritedExport(typeof(ProblemViewModel))]
public abstract class ProblemViewModel : BaseViewModel // or whatever your ViewModels inherit
{
}

// in your App class
{
[ImportMany(typeof(ProblemView))]
public ProblemView[] Views { get; set; }
[ImportMany(typeof(ProblemViewModel))]
public ProblemViewModel[] ViewModels { get; set; }

void MarryViewViewModels()
{// called during MEF composition
foreach (ProblemView view in Views)
{
foreach(ProblemViewModel vm in ViewModels)
{
if(Equals(view.ViewModelType, vm.GetType())
{// match -> inject the ViewModel
view.DataContext = vm;
break;
}
}
}
}
}

// example of usage
public partial class SomeView : ProblemView
{
public override Type ViewModelType { get { return typeof(SomeViewModel); } }
}

关于c# - 使用MEF,如何导出ItemsControl的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12080430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com