簡體   English   中英

如何在WPF中將枚舉與依賴項屬性綁定到組合框?

[英]How do you bind an enum to a dependency property to a combobox in WPF?

我已經閱讀了幾篇文章和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. 如果我按原樣保留該枚舉(名稱=十六進制),那么當我單擊測試按鈕時,沒有任何表面。
  2. 如果我刪除了=十六進制部分(因此,它只具有附件和腮紅),那么每次測試按鈕都會隨附件一起返回。 即使我選擇了腮紅。 (我不想更改枚舉格式,但這告訴我雙向綁定不起作用。)

     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)); })); } 

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

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

然后將您的ComboBox綁定到列表:

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

而且您實際上不需要依賴項屬性。 在視圖模型中實現INotifyPropertyChanged就足夠了。

嘗試以下解決方案: 壓縮解決方案

通常,您必須用對象包裝枚舉。 查看注釋掉的代碼,以了解如何檢索枚舉的名稱。

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}" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM