【问题标题】:ComboBox - Set selected item by enum nameComboBox - 通过枚举名称设置所选项目
【发布时间】:2014-05-18 15:29:20
【问题描述】:

我用 Enum 值初始化我的 ComboBox,如下所示:

private void initPrioritys()
{
    m_PriorityComboBox.DataSource = Enum.GetNames(typeof(MPriority)).ToArray();
}

之后我想更新所选项目:

m_PriorityComboBox.SelectedItem = (MPriority)i_Data.Priority;

这是我的枚举:

public enum MPriority
{
    Critical,
    High,
    Important,
    Medium
}

问题是无论 i_Data.Priority 有什么值,被选中的item都停留在第一个索引。

【问题讨论】:

    标签: c# winforms combobox enums


    【解决方案1】:

    你应该把它改成m_PriorityComboBox.SelectedItem = Enum.GetName(typeof(MPriority), (MPriority)i_Data.Priority);

    由于您的数据源是一个字符串数组——因为Enum.GetNames(typeof(MPriority)).ToArray();——而不是枚举,所以您需要将每个项目作为字符串引用。

    【讨论】:

      【解决方案2】:

      您将DataSource 设置为string 的数组,因此SelectedItem 也需要是字符串:

      m_PriorityComboBox.SelectedItem = i_Data.Priority.ToString();
      

      或将DataSource 设置为枚举值

      m_PriorityComboBox.DataSource = Enum.GetValues(typeof(MPriority));
      

      然后SelectedItem 将是MPriority 类型和

      m_PriorityComboBox.SelectedItem = (MPriority)i_Data.Priority;
      

      会起作用

      【讨论】:

        【解决方案3】:

        我建议使用 DataSourceNameValue 属性的对象。

        m_PriorityComboBox.ValueMember = "Value";
        m_PriorityComboBox.DisplayMember = "Name";
        m_PriorityComboBox.DataSource =
                        Enum.GetNames(typeof(MPriority))
                            .Zip(
                                  Enum.GetValues(typeof(MPriority)).Cast<MPriority>(),
                                  (s, i) => new {Name = s, Value = i }
                                )
                            .ToList();
        

        然后您可以轻松设置SelectedValue 以实现您的目标。

        m_PriorityComboBox.SelectedValue = i_Data.Priority;
        

        【讨论】:

          【解决方案4】:

          也许可以帮助设置 SelectedValue 而不是 SelectedItem:

          <ComboBox ItemsSource="{Binding Source={StaticResource dataFromEnum}}" SelectedValue="{Binding Source={x:Static props:UserSettings.Instance}, Path=DefaultCalcMethod}">
          

          通过这种方式获取枚举项源的位置:

          <ResourceDictionary>
              <ObjectDataProvider x:Key="dataFromEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
                  <ObjectDataProvider.MethodParameters>
                      <x:Type TypeName="calc:Method"/>
                  </ObjectDataProvider.MethodParameters>
              </ObjectDataProvider>
          </ResourceDictionary>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多