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

PowerShell XAML GUI脚本实现IValueConverter时遇错误求助

解决PowerShell XAML中无法加载自定义IValueConverter的问题

兄弟,我完全懂你的痛苦!你已经把转换器的逻辑写对了,甚至测试过实例化和转换都没问题,就是XAML死活找不到这个类型对吧?其实问题出在XAML加载器不知道去哪里找你用Add-Type动态生成的程序集。

问题根源

你用Add-Type生成的DemoConverter类型,是存在PowerShell临时创建的动态程序集里的。而你原来的XAML命名空间声明只写了clr-namespace:MyProject,没有指定程序集名称,XAML加载器根本不知道要去哪个程序集里找这个类型,所以才会抛出Cannot create unknown type的错误。

解决方案:明确指定程序集名称

只需要两步就能搞定:

  1. 获取动态生成的程序集名称
  2. 修改XAML的命名空间声明,加上程序集信息

修改后的完整代码

$src = @'
using System;
using System.Windows;
using System.Windows.Data;
using System.Globalization;
namespace MyProject
{
    public class DemoConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
            {
                return "kuku";
            }
            else
            {
                return "bobo";
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }
}
'@

Add-Type -AssemblyName PresentationFramework
Add-Type -TypeDefinition $src -ReferencedAssemblies PresentationFramework

# 确认转换器工作正常(保留你的验证步骤)
$c = New-Object MyProject.DemoConverter
$c.Convert("gg", $null, $null, $null)
$c.Convert(55, $null, $null, $null)

# 获取动态生成的程序集名称
$assemblyName = (Get-Type MyProject.DemoConverter).Assembly.GetName().Name

# 构建XAML,用双引号字符串替换程序集名称变量
[xml]$XAML = @"
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cnv="clr-namespace:MyProject;assembly=$assemblyName" >
    <Window.Resources>
        <cnv:DemoConverter x:Key="TestConverter" />
    </Window.Resources>
    <Grid>
        <TextBox x:Name="txtTestValue" Text="I'm here to show that xaml loading works!" />
        <!-- 加个TextBlock直观测试转换器效果 -->
        <TextBlock Text="{Binding ElementName=txtTestValue, Path=Text, Converter={StaticResource TestConverter}}" 
                   Margin="0,50,0,0" FontSize="16" />
    </Grid>
</Window>
"@

$reader = New-Object System.Xml.XmlNodeReader $XAML
$Window = [Windows.Markup.XamlReader]::Load($reader)
$Window.ShowDialog() | Out-Null

为什么这样有效?

我们在XAML的命名空间声明里加上了;assembly=$assemblyName,相当于明确告诉XAML加载器:MyProject命名空间下的类型,在这个动态生成的程序集里。而这个程序集已经被PowerShell加载到内存中了,所以加载器能精准定位到DemoConverter类型。

运行代码后,你会看到新增的TextBlock显示"bobo",这说明转换器已经正常工作了!

内容的提问来源于stack exchange,提问作者avic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:52:18