WPF 中的 ComboBox 项 - 具有枚举值的数据绑定类属性

问题描述 投票:0回答:2

我有一个类“Uid_Id_Name”和一个枚举“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
}

我有一个组合框,他的项目是“Uid_Id_Name”

第一项:好的

第二项:“{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>

如何转换?

我看到了类似的问题,但没有一个是关于用枚举来评估类财产的

c# wpf visual-studio xaml data-binding
2个回答
1
投票

您不能在 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>

0
投票

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

[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.Items 中:

<BaseMontanari:Uid_Id_Name Uid="{Binding Source={x:Static my:E_UidIdName_Type.Name}, Converter={StaticResource ToStringConverter}}" Id="testID2" Name="testNAME2"/>
© www.soinside.com 2019 - 2024. All rights reserved.