WPF将枚举绑定到组合框

时间:2018-02-09 09:15:15

标签: c# wpf xaml enums combobox

在我的WPF object print: Horse with 4 legs is a mammal stream print: 22 serialization::archive 16 0 0 4 1 5 Horse 中,我需要在UserControl上绑定Enum。这个ComboBox在本地声明:

enum

在主public partial class ViewerDataConfiguration : UserControl { private ViewerDataConfigurationViewModel PageViewModel; public Visibility IsParametriSelected { get; set; } public IEnumerable<eDatoAlarmMode> EnumAlarmModes { get { return Enum.GetValues(typeof(eDatoAlarmMode)).Cast<eDatoAlarmMode>(); } } 上,有一个集合绑定,我定义了一个Grid,如下所示:

ComboBox

基本上似乎我的<TextBox Grid.Column="16" Text="{Binding ConfigObject.Edit.Source}" Style="{StaticResource txtDataStyle2}" Width="30" Visibility="{Binding ConfigObject.Edit, Converter={StaticResource ListaValoriVisibilityConverter}}" HorizontalAlignment="Stretch" TextChanged="Data_TextChanged" /> <Label Grid.Column="17" Content="AlarmMode" Style="{StaticResource labelStyle2}" /> <ComboBox Grid.Column="18" Width="30" ItemsSource="{Binding Path=EnumAlarmModes, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:ViewerDataConfiguration}}" DisplayMemberPath="Value" SelectedValuePath="Value" Style="{StaticResource comboUsersStyle}" /> 没有正确绑定。我看到了元素,但它们是空白的。任何提示?

1 个答案:

答案 0 :(得分:2)

您正在使用DisplayMemberPathSelectedValuePath属性,但您的集合项类型只是一个简单的字符串,并希望直接使用整个实例,因此您应该删除这些属性,它应该像预期

您还需要将字段更改为属性,因为数据绑定仅适用于属性,而不适用于类字段(尽管UWP中的x:Bind不再具有此限制):

  public IEnumerable<AlarmMode> EnumAlarmModes
    {
        get
        {
            return Enum.GetValues(typeof(AlarmMode)).Cast<AlarmMode>();
        }
    }

如果要显示枚举值而不是名称,请创建一个值转换器:

public class EnumValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value;
    }

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

然后在ItemTemplate

中使用它
<ComboBox Grid.Column="18" Width="100"

    ItemsSource="{Binding Path=EnumAlarmModes}">
    <ComboBox.Resources>
        <local:EnumValueConverter x:Key="EnumValueConverter" />
    </ComboBox.Resources>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource EnumValueConverter}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>     
</ComboBox>

为此,您还必须向xmlns:local添加Window声明:

xmlns:local="clr-namespace:NamespaceOfConverter"