VS2022中WPF绑定internal类至TreeView层级模板的问题求助
WPF XAML报错MC3064:internal类无法在HierarchicalDataTemplate的DataType中使用
在VS2022中开发WPF项目,解决方案包含多个类库项目。其中一个类库中有标记为internal的类S,该类通过GUI项目ViewModel的public ObservableCollection<S>属性暴露,且类库已配置InternalsVisibleTo,C#代码中可正常使用,但在XAML的HierarchicalDataTemplate里指定DataType="{x:Type Models:S}"时,触发MC3064错误,提示:标记中只能使用公共或内部类。'S'类型不是公共或内部类。
特殊现象
- 将
S改为public后,绑定可正常工作; - 不指定
DataType时,嵌套集合绑定TreeView能正常运行; - 移除层级数据模板,仅显示父层级的应用也可正常执行;
- 仅在父层级的
HierarchicalDataTemplate中指定DataType时才会触发错误。
已尝试的方案
曾反编译PresentationFramework.dll查看其命名空间,并尝试添加InternalsVisibleTo,但无效果,推测该错误是VS硬编码导致。
代码示例
报错的XAML代码
<TreeView x:Name="treeViewA" Grid.ColumnSpan="2" ItemsSource="{Binding A}"> <TreeView.Resources> <HierarchicalDataTemplate DataType="{x:Type Models:S}" ItemsSource="{Binding T}"> <StackPanel Orientation="Horizontal" ToolTip="{Binding Desc}" > <TextBlock Text="{Binding Name}" /> </StackPanel> </HierarchicalDataTemplate> </TreeView.Resources> </TreeView>
错误触发在第3行,S位于类库项目中,必须保持internal以防止外部使用;A是ViewModel的public ObservableCollection<S>属性。
C#代码
ViewModel代码:
internal class MainWindowViewModel : BaseViewModel, INotifyPropertyChanged { public ObservableCollection<S>? A { get; set; } }
模型代码:
internal class S { public string Name { get; set; } public string Desc { get; set; } public ObservableCollection<T> Ts { get; set; } }
注:嵌套共2层,省略INotifyPropertyChanged通知实现。
疑问
2024年使用最新版VS2022,是否存在无需将类S改为public,即可在XAML中绑定ViewModel公共集合内internal类的方法?
内容的提问来源于stack exchange,提问作者Faqit
相关产品推荐
相关产品推荐

