2012-02-24 3 views
0

У меня есть DataGrid, который заполняет свои данные из базы данных с помощью DataSet. Теперь мне нужно покрасить фон ячеек на основе их ценности и множества других факторов.Проблема IValueConverter с WPF DataGridCells

Проведя большую часть двух дней, прочесывая интернет, я решил использовать IValueConverter для выполнения этого. После написания кода код выполняется отлично; Я протестировал и увидел, что 1) класс IValueConverter вызывается и 2) он действительно возвращает цвет кисти.

Моя проблема заключается в том, что ячейки не окрашиваются приложенной палитрой кисти во время выполнения.

Как-то я знаю, что что-то работает, потому что, когда я выбираю каждую строку, ячейки, которые должны быть окрашены, подсвечиваются другим цветом (в данном случае ярким белым), чем выбор по умолчанию синий». Таким образом, по какой-либо причине, хотя ячейки преобразуются и вызывают IValueConverter, макет NOT, отображающий его. Я также выполнил еще один тест, в котором я просто установил CellStyle на прямой цвет (в данном случае LimeGreen) и полностью проигнорировал IValueConverter, и ячейки DID APPEAR в Lime-Green. Это заставляет меня думать, что что-то не так где-то между Binding и Convert().

Я абсолютно не понимаю, почему цвет преобразования не отображается, и я исчерпал каждый результат поиска на первых страницах Google, поэтому я надеюсь, что кто-то здесь может взглянуть на мой код и точку для меня точно, почему DataGrid действует таким образом.

DataTable dt = new DataTable(); 
     dt = ((DataSet)ItemSource).Tables[0]; 
     int counter = 0; 

     foreach (DataColumn dc in dt.Columns) 
     { 
      switch(dc.ColumnName) 
      { 
      (....) 
      case "SEAPCT": 
        DataGridTextColumn col2 = new DataGridTextColumn(); 

        col2.Header = (((DataSet)ItemSource).Tables[0].Columns[counter].ToString()).Replace("PCT", "%"); 
        col2.Binding = new Binding(dc.ColumnName); 

        Style style = new Style(typeof(DataGridCell)); 

        Setter setter = new Setter(); 
        setter.Property = DataGridCell.BackgroundProperty; 

        Binding b = new Binding(dc.ColumnName); 
        b.Converter = new PercentCellConverter(); 

        setter.Value = b; 
        style.Setters.Add(setter); 

        col2.CellStyle = style; 


        DashboardGrid.Columns.Insert(counter, col2); 
        counter++; 
        break; 
      } 
     } 

     DashboardGrid.ItemsSource = dt.DefaultView; 
    } 

И для справки, мой IValueConverter класс:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string n = value.ToString(); 
     System.Diagnostics.Debug.WriteLine(n); 

     if (double.Parse(n) > 0) 
      return Brushes.LimeGreen; 
     else if (double.Parse(n) == 0) 
      return Brushes.Yellow; 
     else 
      return Brushes.Red; 

    } 
+0

Не видите никаких проблем в этом коде (даже если C# делает это сложнее сказать вообще), применили ли вы пользовательские шаблоны к своим DataGrid и DataGridCells? –

+0

@ H.B. Нет настраиваемых шаблонов. Все, что вы видите здесь, это то, что применяется к DataGrid - никакого дополнительного XAML. –

+0

Ну, когда я беру этот код и просто меняю исходный код и соответствующие привязки, он работает. –

ответ

1

Я понял это: в моем IValueConverter классе, я использовал System.Drawing.Brushes вместо System.Windows.Media.Brushes. Итак, хотя мой конвертер WAS работает правильно, цвета не отображались просто потому, что я возвращал неправильный тип группы цветов.

+0

Я думаю, что вы могли бы легко отладить эту, я не мог упомянуть, что вы должны посмотреть на окно вывода Visual Studio, потому что сама привязка работала (как был вызван преобразователь). В этом окне появляются ошибки привязки, поэтому вы должны увидеть исключение, вызванное недопустимым назначением типа, вызванное конвертером. –

+0

@ H.B. да, я действительно должен был.Не знаю, почему я этого не сделал. Я совершенно забыл, что в нем было два пространства имен с кистями, что усугубляло вопросы. –

 Смежные вопросы

  • Нет связанных вопросов^_^