【问题标题】:How to change combobox particular item color dynamically in wpf如何在wpf中动态更改组合框特定项目的颜色
【发布时间】:2020-03-21 04:00:53
【问题描述】:
<Grid x:Name="LayoutRoot">
    <ComboBox x:Name="com_ColorItems" Height="41" Margin="198,114,264,0" VerticalAlignment="Top" FontSize="13.333" FontWeight="Bold" Foreground="#FF3F7E24"/>
</Grid>

使用上面的代码,我将组合框中的所有项目都涂成绿色。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
        for (int i = 0; i < 5; i++)
        {
            com_ColorItems.Items.Add(i);
        }
}

使用上面的代码,我在组合框中填写了五个项目。现在我喜欢在后面的代码中动态地将第 3 项 (3) 的颜色更改为“红色”。我该怎么做?

【问题讨论】:

    标签: c# wpf combobox


    【解决方案1】:

    不要在组合框中添加i 的实际值,而是添加ComboBoxItem

    private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < 5; i++)
            {
                ComboBoxItem item = new ComboBoxItem();
    
                if (i == 2) item.Foreground = Brushes.Blue;
                else item.Foreground = Brushes.Pink;
    
                item.Content = i.ToString();
                com_ColorItems.Items.Add(item);
            }
        }
    

    如果您以后想修改使用此方法创建的 ComboBoxItem,您可以这样做:

    var item = com_ColorItems.Items[2] as ComboBoxItem; // Convert from Object
    if (item != null)                                   // Conversion succeeded 
    {
        item.Foreground = Brushes.Tomato;
    }
    

    【讨论】:

      【解决方案2】:

      首先,尝试绑定你的Source,避免通过后面的代码直接访问。 而且您可以在 ItemSource Binding 中使用 Converter。

      例如

      ItemSource={Binding MyComboboxItems, Converter={StaticResource MyConverter}}
      

      然后在您的转换器中找到第三个项目并给它们一个不同的前景色

      【讨论】:

      • 你能举个小例子吗? MyComboboxItems 的类型是什么?
      【解决方案3】:

      除了马里奥·宾德斯的回答,这里有一个这样的转换器的例子:

      public class ListToColoredComboboxItemsConverter : IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
          {
              if (value is IEnumerable<Measurement> measurements)
              {
                  var comboBoxItems = new List<ComboBoxItem>(measurements.Count());
                  foreach (var measurement in measurements)
                  {
                      var item = new ComboBoxItem();
                      item.Content = measurement;
                      if (!string.IsNullOrWhiteSpace(measurement.ErrorMessage))
                          item.Foreground = Brushes.Red;
                      comboBoxItems.Add(item);
                  }
                  return comboBoxItems;
              }
              return null;
          }
      
          public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
          {
              throw new NotImplementedException();
          }
      }
      

      也许您还想将选定的项目转换回一个值:

      public class ComboBoxItemToItemConverter : IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
          {
              return value;
          }
      
          public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
          {
              if (value is ComboBoxItem comboBoxItem)
              {
                  return comboBoxItem.Content;
              }
              return null;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-12-13
        • 1970-01-01
        • 2022-01-21
        • 2019-05-15
        • 1970-01-01
        • 2018-04-06
        • 1970-01-01
        • 2016-02-20
        相关资源
        最近更新 更多