WPF结合了枚举与组合



在我的WPF UserControl中,我需要在ComboBox上绑定Enum。此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}" />

基本上似乎我的IEnumerable没有正确绑定。我看到了元素,但它们是空白的。任何提示?

您使用的是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>

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

xmlns:local="clr-namespace:NamespaceOfConverter"

最新更新