【问题标题】:Bind a DataGridComboBoxColumn to an Enum将 DataGridComboBoxColumn 绑定到枚举
【发布时间】:2011-12-21 03:24:33
【问题描述】:

我有一个简单的 DataGrid,我希望用户向其中添加一些行。 但是,我希望其中一列是 ComboBox,其值取自 enum

在我的 XAML 中执行此操作的最简单方法是什么?

我尝试了以下操作,但收到错误 “双向绑定需要 Path 或 XPath”

<Window.Resources>
    <ObjectDataProvider x:Key="myEnumData"
                MethodName="GetValues" 
                ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:MyEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

...

   <DataGrid.Columns>
        <DataGridComboBoxColumn Header="MyHeader" DisplayMemberPath="EnumValue" 
            SelectedItemBinding="{Binding Source={StaticResource myEnumData}}">
        </DataGridComboBoxColumn>
    </DataGrid.Columns>

【问题讨论】:

    标签: wpf data-binding wpfdatagrid


    【解决方案1】:

    当您(可能)想要绑定可用项目列表时,您正在尝试绑定所选项目。将您的绑定更改为:

    <DataGridComboBoxColumn Header="MyHeader"
            ItemsSource="{Binding Source={StaticResource myEnumData}, Mode=OneWay}">
    </DataGridComboBoxColumn>
    

    【讨论】:

    • 嗨史蒂夫,我现在没有收到错误 - 谢谢。但是 ComboBox 是空的。我应该提到,DataGrid 一开始是空的,我正在填写所有行(没有现有数据)。
    • 你的意思是ComboBox没有选中项,还是点击时下拉列表中没有项?
    • 我的意思是ComboBox中没有项目
    • 啊,我刚刚发现了DisplayMemberPath - 这可能是导致值不显示的原因。我已经更新了我的示例
    • 史蒂夫,快到了。当我单击它时,枚举位于 ComboBox 中。但是,当我单击它时,组合框不可见(即移动到下一列等)
    【解决方案2】:

    XAML

    xmlns:ext="clr-namespace:Project.Core.Tools;assembly=Project.Core"
    
    <DataGridComboBoxColumn ItemsSource="{x:Static ext:Extensions.GetEnumTypes}" SelectedItemBinding="{Binding EnumType}" />
    

    静态类

    public static IEnumerable<EnumType> GetEnumTypes => Enum.GetValues(typeof(EnumType)).Cast<EnumType>();
    

    【讨论】:

      【解决方案3】:

      XAML:

      &lt;DataGridComboBoxColumn ItemsSource="{Binding Orientantion, Mode=OneTime, Converter={Converts:EnumToItemSourceConverter}}" SelectedItem="{Binding Orientantion}"/&gt;

      C#:

      public enum OrientantionTypes : int { Custom, Automatic}
      
      public OrientantionType Orientantion { get; set;}
      

      转换器:

      public class EnumToItemSourceConverter: MarkupExtension, IValueConverter
      {
          public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
          {
              if (!(value is Enum ))
                  return null;
              {
                  Type enumType = value.GetType();
                  var listType = typeof(List<>);
                  var constructedListType = listType.MakeGenericType(enumType);
      
                  var instance = Activator.CreateInstance(constructedListType);
      
                  foreach (var m in Enum.GetValues(enumType))
                  {
                      ((IList)instance).Add(m);
                  }
                  return (IList)instance;
              }
      
              return null;
          }
      
          public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
          {
              throw new NotImplementedException();
          }
      
          public override object ProvideValue(IServiceProvider serviceProvider)
          {
              return this;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-06-09
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        相关资源
        最近更新 更多