You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:50:28