XAML 如何在另一个程序集中使用转换器加载视图[MAUI.NET]

qyuhtwio  于 2023-01-28  发布在  .NET
关注(0)|答案(1)|浏览(146)

我有一个转换器

using System.Globalization;
namespace WidgetsForRuntimeInjection.Converters
{
    public class SampleBooleanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        { ... }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        { ... }
    }
}

和一个视野

<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:viewModels="clr-namespace:WidgetsForRuntimeInjection.ViewModels"
             xmlns:converters="clr-namespace:WidgetsForRuntimeInjection.Converters;assembly=WidgetsForRuntimeInjection"
             x:Class="WidgetsForRuntimeInjection.Views.SampleWidgetsForInjection">
    <converters:SampleBooleanConverter x:Key="SampleBooleanConverter"/>
    <DataTemplate x:DataType="viewModels:SwitchViewModel" x:Key="SwitchDataTemplate">
        <Switch IsToggled="{Binding Value, Converter={StaticResource SampleBooleanConverter}}" IsEnabled="{Binding ReadWrite}"/>
    </DataTemplate>
</ResourceDictionary>

它们都在构建为DLL的单个程序集中。
然后在另一个程序集中加载它并将其添加到应用程序资源。

var assembly = Assembly.LoadFile( ... path to dll... );
var resources = assembly.CreateInstance("WidgetsForRuntimeInjection.Views.SampleWidgetsForInjection");
App.Current.Resources.Add("SwitchDataTemplate", (resources as ResourceDictionary)["SwitchDataTemplate"]);

我得到了这样的错误:

Microsoft.Maui.Controls.Xaml.XamlParseException: 'Position 7:6. Type converters:SampleBooleanConverter not found in xmlns clr-namespace:WidgetsForRuntimeInjection.Converters;assembly=WidgetsForRuntimeInjection'

但是我可以在前面一行创建这个转换器的示例(在第二个程序集中)。

var converter = assembly.CreateInstance("WidgetsForRuntimeInjection.Converters.SampleBooleanConverter");

当然,没有转换器的情况下,这一切都像一个魅力。
如何让它工作?我尝试做转换器作为DynamicResource和声明不同的转换器命名空间。

    • 更新日期:**

这是一种奇怪的,因为它似乎工作后,我已经添加了相同的替代方式-在xaml.cs文件如下:

public partial class SampleWidgetsForInjection : ResourceDictionary
{
    public SampleWidgetsForInjection()
    {
        this.Add("SampleBooleanToColorConverter", new SampleBooleanToColorConverter());
        InitializeComponent();
    }
}
jyztefdp

jyztefdp1#

因此,这似乎是一种变通方案/解决方案:

public partial class SampleWidgetsForInjection : ResourceDictionary
{
    public SampleWidgetsForInjection()
    {
        this.Add("SampleBooleanToColorConverter", new SampleBooleanToColorConverter());
        InitializeComponent();
    }
}

相关问题