在 XAML 中使用泛型:WPF

Using generics in XAML: WPF

我正在尝试在我的代码中使用 x:TypeArguments,以便我可以在 XAML 中使用泛型。如何使用它的一个例子是:

<ComboBoxItem>
    <local:CustomKeyValuePair x:TypeArguments="x:String, x:String"
                              Key="Label To Show 01"
                              Value="Content To Show 01" />
</ComboBoxItem>

但是,我遇到了错误

error MC6022: Only a root tag can specify attribute 'x:TypeArguments'. Line 34 Position 43.

我也尝试在文件顶部使用 xmlns:x="http://schemas.microsoft.com/netfx/2009/xaml/presentation" 而不是 http://schemas.microsoft.com/winfx/2006/xaml,但这给了我一个不同的错误

error MC3072: The property 'Class' does not exist in XML namespace 'http://schemas.microsoft.com/netfx/2009/xaml/presentation'. Line 1 Position 9.

有什么方法可以在 WPF 中实现吗?


MCVE 所需代码

CustomKeyValuePair.cs

namespace GenericXamlMvce;

public record CustomKeyValuePair<K, V>
{
    public CustomKeyValuePair() { }

    public CustomKeyValuePair(K key, V value)
    {
        Key = key;
        Value = value;
    }

    public K Key { get; init; }

    public V Value { get; init; }

    public void Deconstruct(out K key, out V value)
    {
        key = Key;
        value = Value;
    }
}

MainWindow.xaml

<Window x:Class="GenericXamlMvce.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:GenericXamlMvce"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0"
                               Grid.Row="0"
                               Text="Image: "
                               VerticalAlignment="Center"
                               Margin="5 0 2 0" />

        <ComboBox x:Name="DemoSelector"
                  Grid.Column="1"
                  Grid.Row="0"
                  SelectedIndex="0"
                  Margin="0 5 5 5"
                  DisplayMemberPath="Key"
                  SelectedValuePath="Value">
            <ComboBoxItem>
                <local:CustomKeyValuePair x:TypeArguments="x:String, x:String"
                                  Key="Label To Show 01"
                                  Value="Content To Show 01" />
            </ComboBoxItem>

            <ComboBoxItem>
                <local:CustomKeyValuePair x:TypeArguments="x:String, x:String"
                                          Key="Label To Show 02"
                                          Value="Content To Show 02" />
            </ComboBoxItem>
        </ComboBox>

        <TextBlock Grid.Column="0"
                   Grid.Row="1"
                   Grid.ColumnSpan="2"
                   Margin="10"
                   FontSize="20"
                   FontWeight="Bold"
                   Text="{Binding ElementName=DemoSelector, Path=SelectedValue}" />
    </Grid>
</Window>

Is there any way that this can be achieved in WPF?

不,恐怕不会。

错误信息是正确的,只有根元素,例如 a window,可以指定x:TypeArguments属性。

为了能够在 XAML 中实例化和使用通用 CustomKeyValuePair<K, V> 类型,您必须为每个类型组合创建一个 non-generic sub-class参数,例如:

public class StringIntCustomKeyValuePair : CustomKeyValuePair<string, int> { }

XAML:

<local:StringIntCustomKeyValuePair />