gpt4 book ai didi

WPF MVVM : Convention over Configuration for ResourceDictionary?

转载 作者:行者123 更新时间:2023-12-04 13:21:44 27 4
gpt4 key购买 nike

更新

本着 StackOverflow 的 wiki 精神,这里有一个更新:

我在下面添加了 Joe White 的 IValueConverter 建议。它就像一个魅力。

我已经编写了一个“快速入门”示例,它使用一些廉价的字符串替换来自动映射 ViewModels->Views。如果没有找到代表 ViewModel 的 View,则默认为“正在 build 中”页面。我将这种方法称为“WPF MVVM White”,因为这是 Joe White 的想法。这是几个屏幕截图。

第一个图像是“[SomeControlName]ViewModel”的案例,基于纯命名约定,有一个对应的“[SomeControlName]View”。第二种情况是 ModelView 没有任何 View 来表示它。不再有长 ViewModel 到 View 映射的 ResourceDictionaries。现在是纯粹的命名约定。

Wpf Mvvm White

我在这里发布了该项目的下载:
Mvvm.White.Quickstart.zip

原帖

我读了乔什·史密斯的 fantastic MSDN article周末在 WPF MVVM 上。它注定会成为经典。

我花了一段时间才理解要求 WPF 呈现 ViewModel 的魔力。

这就像说“这是一个类,WPF。去找出使用哪个 UI 来呈现它。”

对于那些错过这个魔法的人,WPF 可以通过在 ResourceDictionary 映射中查找 ModelView 的 View 并拉出相应的 View 来做到这一点。 (向下滚动到 Figure 10 Supplying a View )。

我立即跳出来的第一件事是已经有一个强大的命名约定:

classNameView  ("View" suffix)
classNameViewModel ("ViewModel" suffix)

我的问题是:

由于 ResourceDictionary可以以编程方式进行操作,我想知道是否有人设法使用 Regex.Replace 整个东西,所以查找是自动的,并且任何新的 View/ViewModels 都通过它们的命名约定得到解决?

[编辑] 我想象的是对 ResourceDictionary 的钩子(Hook)/拦截。

... 还考虑在启动时使用互操作拉出 *View$ 的方法和 *ViewModel$在代码中构建 DataTemplate 字典的类名:
//build list
foreach ....
String.Format("<DataTemplate DataType=\"{x:Type vm:{0} }\"><v:{1} /></DataTemplate>", ...)

最佳答案

与其编写代码来显式地将内容添加到 ResourceDictionary,不如按需生成正确的 View 怎么样?您可以使用 ValueConverter 执行此操作。

您的资源将如下所示:

<Views:ConventionOverConfigurationConverter x:Key="MyConverter"/>
<DataTemplate DataType="{x:Type ViewModels:ViewModelBase}">
<ContentControl Content="{Binding Converter={StaticResource MyConverter}}"/>
</DataTemplate>

您仍然需要一个 DataTemplate 资源,但只要您的 ViewModel 都有一个公共(public)基类,您只需要一个 DataTemplate 来处理所有这些。

然后定义值转换器类:
public class ConventionOverConfigurationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
// value is the ViewModel. Based on its GetType(), build a string
// with the namespace-qualified name of the view class, then:
return Activator.CreateInstance(Type.GetType(viewName));
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

您需要做的就是在 Convert 中编写逻辑,这取决于您的 View 和 ViewModel 是否在同一个命名空间中。

关于WPF MVVM : Convention over Configuration for ResourceDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/768304/

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