如何将enum绑定到依赖属性到WPF中的组合框?

时间:2014-10-25 17:14:51

标签: c# wpf xaml combobox enums

我已经阅读了几篇文章和stackoverflow帖子,但我仍然对如何使这项工作感到困惑。

我有一个枚举列表,我想绑定到依赖属性,然后绑定到组合框。当我加载程序时,组合框是空的。

一旦这个工作,我想在框中显示名称(即附件),并将十六进制显示为值。

XAML:

<ComboBox ItemsSource="{Binding BodyTypeFlags}" />

C#:

public enum BodyTypeFlagsTS4
{
    Accessory = 0x0000000A,
    Blush = 0x00000020
}

public BodyTypeFlagsTS4 BodyTypeFlags
{
    get { return (BodyTypeFlagsTS4)GetValue(BodyTypeFlagsProperty); }
    set { SetValue(BodyTypeFlagsProperty, value); }
}

public static readonly DependencyProperty BodyTypeFlagsProperty =
    DependencyProperty.Register("BodyTypeFlags", typeof(BodyTypeFlagsTS4),
    typeof(MainWindow), new PropertyMetadata(default(BodyTypeFlagsTS4)));

修改 我按照建议完成了,现在我可以在组合框中看到枚举项列表。我有两个问题:

  1. 如果我按原样保持枚举(Name = Hex),那么当我点击测试按钮时,没有任何表面。
  2. 如果我删除= hex部分(因此,它只有附件和腮红),那么每次都会使用附件返回测试按钮。即使我选择了脸红。 (我不想改变枚举格式,但这告诉我双向绑定不起作用。)

                                

    public BodyTypeFlagsTS4 BodyTypes
    {
        get { return (BodyTypeFlagsTS4)GetValue(BodyTypesProperty); }
        set { SetValue(BodyTypesProperty, value); }
    }
    
    public static readonly DependencyProperty BodyTypesProperty =
        DependencyProperty.Register("BodyTypes", typeof(BodyTypeFlagsTS4), typeof(MainWindow), new PropertyMetadata());
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Dispatcher.BeginInvoke(new Action(() =>
        {
            System.Windows.MessageBox.Show(System.Enum.GetName(typeof(BodyTypeFlagsTS4), this.BodyTypes));
        }));
    }
    

2 个答案:

答案 0 :(得分:2)

您需要提供ComboBox的可用值列表。例如:

public BodyTypeFlagsTS4[] AvailableBodyTypeFlags
{
    get { return (BodyTypeFlagsTS4[])Enum.GetValues(typeof(BodyTypeFlagsTS4)); }
}

然后将ComboBox绑定到列表:

<ComboBox ItemsSource="{Binding AvailableBodyTypeFlags}"
          SelectedItem="{Binding BodyTypeFlags}" />

并且您实际上并不需要依赖项属性。在视图模型中实现INotifyPropertyChanged就足够了。

答案 1 :(得分:1)

试试这个解决方案: Zip with solution

通常,您必须用对象包装枚举。 查看注释掉的代码,了解如何检索枚举的名称。

XAML代码的一部分:

    <Grid.Resources>
        <ObjectDataProvider x:Key="tools"
                            MethodName="GetValues"
                            ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:Tool" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Grid.Resources>
    <ComboBox x:Name="cmbTools"
              ItemsSource="{Binding Source={StaticResource tools}}"
              SelectedItem="{Binding Path=ToolType, Mode=TwoWay}" />