在 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 />
我正在尝试在我的代码中使用 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?
不,恐怕不会。
错误信息是正确的,只有根元素,例如x:TypeArguments
属性。
为了能够在 XAML 中实例化和使用通用 CustomKeyValuePair<K, V>
类型,您必须为每个类型组合创建一个 non-generic sub-class参数,例如:
public class StringIntCustomKeyValuePair : CustomKeyValuePair<string, int> { }
XAML:
<local:StringIntCustomKeyValuePair />