XAML WPF中的ComboBox项-使用枚举值绑定类属性

ev7lccsx  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(152)

我有一个类“Uid_Id_Name”和一个ENUM“E_UidIdName_Type”

public class Uid_Id_Name
{
    public string Uid { get; set; } = "";
    public string Id { get; set; } = "";
    public string Name { get; set; } = "";
}

public enum E_UidIdName_Type
{
    Name,
    NameShort
}

我有一个ComboBox,他的项目是“Uid_Id_Name”
第一项:OK
第二项:“{x:Static my:E_UidIdName_Type.Name}”给予了必须转换为字符串的错误

<ComboBox SelectedValuePath="Uid"  ItemTemplate="{StaticResource Uid_Id_Name_Template}">
    <ComboBox.Items >
        <BaseMontanari:Uid_Id_Name Uid="testUID" Id="testID" Name="testNAME"/>
        <BaseMontanari:Uid_Id_Name Uid="{x:Static my:E_UidIdName_Type.Name}" Id="testID2" Name="testNAME2"/>                                        
    </ComboBox.Items>
</ComboBox>

我如何转换它?
我看到了类似的问题,但没有一个是关于一个枚举类财产的价值

m528fe3b

m528fe3b1#

不能对CLR属性使用绑定。它必须是一个依赖属性。
您应该通过编程方式 * 设置 * 数据项的值:

Uid_Id_Name item = cmb.Items[1] as Uid_Id_Name;
if (item != null)
    item.Uid = E_UidIdName_Type.Name.ToString();

XAML:

<ComboBox x:Name="cmb" SelectedValuePath="Uid" DisplayMemberPath="Uid">
    <ComboBox.Items>
        <BaseMontanari:Uid_Id_Name Uid="testUID" Id="testID" Name="testNAME"/>
        <BaseMontanari:Uid_Id_Name Id="testID2" Name="testNAME2"/>
    </ComboBox.Items>
</ComboBox>

XAML是一种标记语言。您可以使用ItemTemplate * 显示 * 枚举值:

<ComboBox x:Name="cmb" SelectedValuePath="Uid">
    <ComboBox.Items>
        <BaseMontanari:Uid_Id_Name Uid="testUID" Id="testID" Name="testNAME"/>
        <BaseMontanari:Uid_Id_Name Uid="{x:Null}" Id="testID2" Name="testNAME2"/>
    </ComboBox.Items>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock>
                    <TextBlock.Style>
                        <Style TargetType="TextBlock">
                            <Setter Property="Text" Value="{Binding Uid}" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Uid}" Value="{x:Null}">
                                    <Setter Property="Text" Value="{Binding 
                                                Source={x:Static my:E_UidIdName_Type.Name}}" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
6g8kf2rb

6g8kf2rb2#

如果你想这样做,你可以使用转换器。首先,你应该创建一个像这样的:

[ValueConversion(typeof(E_UidIdName_Type), typeof(string))]
public class ToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value?.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后你必须在之前的资源中包含你的转换器(不要忘记添加转换器的命名空间:

<UserControl.Resources>
    <converters:ToStringConverter Name="ToStringConverter"/>
</UserControl.Resources>

在您的ComboBox中。项目:

<BaseMontanari:Uid_Id_Name Uid="{Binding Source={x:Static my:E_UidIdName_Type.Name}, Converter={StaticResource ToStringConverter}}" Id="testID2" Name="testNAME2"/>

相关问题