Search code examples
c#wpfvisual-studioxamldata-binding

ComboBox Item in WPF - Databinding class property with enum value


I have a CLASS "Uid_Id_Name" and an 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
}

I have a ComboBox and his items are "Uid_Id_Name"

FIRST item: OK

SECOND item: "{x:Static my:E_UidIdName_Type.Name}" give me the error that must be converted to a string

<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>

How can i convert it ?

I saw similar question but none of them are regarding valorisation of class property with an enum


Solution

  • You cannot use a binding on a CLR property. It has to be a dependency property.

    You should set the value of your data items programmatically:

    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 is a markup language. You may display the enum value using an ItemTemplate though:

    <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>