.NET Framework 4.8 WPF中如何结合DI选项模式使用ResourceDictionary
.NET Framework 4.8 WPF MVVM:ResourceDictionary Style绑定运行时DI配置问题
项目背景
- 开发基于.NET Framework 4.8的WPF MVVM项目,使用Microsoft.Extensions.Hosting及相关依赖注入(DI)库
- 已准备简化后的示例项目复现问题
- 核心需求:在UserControl中引用ResourceDictionary内的Style,且Style的取值由运行时DI提供的配置动态填充
关键代码位置
- ProjectB\ResourceDictionary.xaml 第13行
- ProjectC\AnotherControlUserControl.xaml 第44行
- ProjectA\App.xaml.cs 第28行、第32行
- ProjectA\appsettings.json 第7行
场景与问题
将十六进制颜色代码存储在appsettings.json中,通过IHost配置加载后,利用Options模式映射到ColorSettings类。Window由嵌套的UserControl组成,部分UserControl通过Host.CreateDefaultBuilder().ConfigureServices(...)注入实例化,部分直接在XAML中实例化(无对应ViewModel)。
当前遇到的问题:AnotherControlUserControl的Rectangle(第44行)绑定Style时,无法正确获取appsettings.json中的颜色值,仅显示白色。
已尝试的解决方案
- 创建ColorSettingsFactory类,在DI代码中设置其ColorSettings属性,尝试替换ResourceDictionary.xaml中的ColorSettings,但XAML无法实例化无参构造函数的类
- 尝试多种绑定语法:DynamicResource、StaticResource,以及配置
Mode=TwoWay、UpdateSourceTrigger=PropertyChanged等 - 让ColorSettings实现
INotifyPropertyChanged(基于Community Toolkit MVVM的ObservableObject),无效果 - 在App.xaml.cs中调用
startupWindow.UpdateLayout()强制更新UI,无效 - 找到一种可行但不够优雅的方案:将
IOptions<ColorSettings>注入MyDisplayViewModel类,在AnotherControlUserControl的XAML中使用Fill="{Binding ColorSettings.ColorHeader}"。但该方案不符合需求:希望将所有Style定义集中在ResourceDictionary.xaml统一管理,且不想向ViewModel注入大量IOptions<...>实例 - 参考多篇Stack Overflow帖子尝试解决,未找到合适方案
期望目标
当DI容器中的ColorSettings更新时,ResourceDictionary.xaml中的对应值同步更新,并自动反映到所有引用该Style的控件上,解决DI容器与XAML之间的状态脱节问题。
内容的提问来源于stack exchange,提问作者JD136
相关产品推荐
相关产品推荐

