在运行时将XAML加载到控件中并使用该控件的资源

4

这里有很多关于在运行时加载XAML的问题,但据我所知这并不是重复的问题。

我正在运行时将XAML加载到控件中:

<ContentControl Content="{Binding Layout.View, Converter={StaticResource StringToXamlConverter}}"/>

这个转换器相当简单:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    string xaml;
    if (value != null)
    {
        xaml = value.ToString();
    }
    else
    {
        xaml = Settings.Default.DefaultLayoutView;
    }

    var root = XamlReader.Parse(xaml);
    return root;
}

现在,在加载的XAML中,我需要使用ValueConverters。这些转换器被定义为窗口资源,用于加载XAML。例如:

<c:BooleanToVisibilityValueConverter x:Key="BooleanToVisibilityConverter"/>

当然,如果我在读取时尝试使用此资源,XamlReader.Parse() 方法会抛出异常,因为此时该资源不可用。
Visibility="{Binding Layout.TextItem1.IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}}"

有没有办法规避这个问题? 也许有一种方法可以告诉XamlReader忽略它? 或者有一种替代ValueConverters的方法可以在这种情况下使用?

请注意,使用DynamicResource也不起作用。它们不能用于ValueConverters。

1个回答

7

更新

好的,你是正确的,动态资源将不起作用。我想出了两个解决方案,最好的部分是,我已经测试过,两者都可以实现。

选择1:在应用程序资源app.xaml中定义静态资源。

选择2:不要为转换器使用静态资源,只需在xaml中创建转换器。很抱歉没有按照你使用的xaml进行操作,但你会明白的:

<Button>
    <Button.Visibility>
        <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}">
            <Binding.Converter>
                <controls:BooleanToVisibilityConverter />
            </Binding.Converter>
        </Binding>                   
    </Button.Visibility>

    <Button.Tag>
        <sys:Boolean>True</sys:Boolean>
    </Button.Tag>
</Button>

那个答案之前就在这里,但它不起作用。DynamicResource不能用于ValueConverter。 - TimothyP
你是对的,我更新了我的答案并提供了两个可行的解决方案。 - J Cooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接