DataTemplate 内的交互触发器不适用于 XamlReader

Man*_*anu 8 c# wpf eventtrigger xamlreader

我正在尝试使用在代码后面动态创建的(对于 WPF 数据网格)XamlReader.Load()进行解析:DataTemplate

DataTemplate dataTemplate;

StringReader template = new StringReader($@"
<DataTemplate
    xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
    xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
    xmlns:local=""clr-namespace:MyApp;assembly=MyApp"">
<DataTemplate.Resources>
    <local:ArrayMultiValueConverter x:Key=""arrayMultiValueConverter""/>
</DataTemplate.Resources>
    <StackPanel Orientation=""Vertical"">
        <Expander VerticalAlignment=""Center"" xmlns:i=""http://schemas.microsoft.com/xaml/behaviors"">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName=""IsExpanded"">
                <i:InvokeCommandAction Command=""{{Binding DataContext.TextFilterColumn}}""/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
            <Expander.Header>
                <TextBlock x:Name=""{dtColumnName}"" VerticalAlignment=""Center"" Text=""{{TemplateBinding Content}}"" Margin=""5,5,5,0"" FontWeight=""SemiBold""/>
            </Expander.Header>
            <StackPanel Orientation=""Horizontal"">
                <TextBox x:Name=""{"TbxFilter" + dtColumnName}"" Width=""100"" Margin=""5""/>
                <TextBlock Margin=""0,0,5,0"" VerticalAlignment=""Center"" FontFamily=""Segoe MDL2 Assets"">
                    <Hyperlink TextDecorations=""{{x:Null}}"" Command=""{{Binding DataContext.FilterColumnName, RelativeSource={{RelativeSource FindAncestor, AncestorType={{x:Type Window}}}}}}"">
                        <Hyperlink.CommandParameter>
                            <MultiBinding Converter=""{{StaticResource arrayMultiValueConverter}}"">
                                <Binding Path=""Text"" ElementName=""{dtColumnName}"" />
                                <Binding Path=""Text"" ElementName=""{"TbxFilter" + dtColumnName}"" />
                            </MultiBinding>
                        </Hyperlink.CommandParameter>   
                        &#xE721;
                    </Hyperlink>
                </TextBlock>
                <TextBlock Margin=""0,0,5,0"" VerticalAlignment=""Center"" FontFamily=""Segoe MDL2 Assets"">
                    <Hyperlink TextDecorations=""{{x:Null}}"" Command=""{{Binding DataContext.FilterColumnName, RelativeSource={{RelativeSource FindAncestor, AncestorType={{x:Type Window}}}}}}"">
                        <Hyperlink.CommandParameter>
                            <MultiBinding Converter=""{{StaticResource arrayMultiValueConverter}}"">
                                <Binding Path=""Text"" ElementName=""{dtColumnName}""/>
                                <Binding Path=""Text"" RelativeSource=""{{RelativeSource FindAncestor, AncestorType={{x:Type TextBlock}}}}""/>
                            </MultiBinding>
                        </Hyperlink.CommandParameter>
                        &#xe75c;
                    </Hyperlink>
                </TextBlock>
            </StackPanel>
        </Expander>
    </StackPanel>
</DataTemplate>
");

XmlReader xmlReader = XmlReader.Create(template);
dataTemplate = XamlReader.Load(xmlReader) as DataTemplate;

textColumn.HeaderTemplate = dataTemplate;
Run Code Online (Sandbox Code Playgroud)

当我删除这部分代码时,一切正常:

<i:Interaction.Triggers>
    <i:EventTrigger EventName=""IsExpanded"">
        <i:InvokeCommandAction Command=""{{Binding DataContext.TextFilterColumn}}""/>
    </i:EventTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)

但是当我添加它时,有一个Exception Thrown

System.Windows.Markup.XamlParseException:“无法设置未知成员‘{http://schemas.microsoft.com/xaml/behaviors}Interaction.Triggers’。” 行号“11”和行位置“10”。

我在本文后面使用“XAML 行为”(但同样的情况也发生在Interactivity):

https://devblogs.microsoft.com/dotnet/open-source-xaml-behaviors-for-wpf/

这似乎是一个问题XamlReader.Load(xmlReader)

如果有人知道解决方法,我将不胜感激。

配置 :

  • 框架 4.8(尝试使用 4.7.2)
  • Microsoft.Xaml.Behaviors.Wpf 1.1.39

谢谢。

use*_*152 6

XamlReader.Load的文档中未提及这一点,但 XAML 命名空间映射中引用的任何自定义程序集必须已可供应用程序使用。

您有两个选择:

1.在读取 xaml 输入之前加载程序集Microsoft.Xaml.Behaviors或从程序集中初始化某些类型。

Assembly assembly = Assembly.LoadFrom("Microsoft.Xaml.Behaviors.dll");
Run Code Online (Sandbox Code Playgroud)

或者

var et = new Microsoft.Xaml.Behaviors.EventTrigger();
Run Code Online (Sandbox Code Playgroud)

2.在xaml中使用CLR命名空间声明

xmlns:i=""clr-namespace:Microsoft.Xaml.Behaviors;assembly=Microsoft.Xaml.Behaviors""
Run Code Online (Sandbox Code Playgroud)