none
При подсветке ячеек в WPF DataGrid без Refresh() цвета не меняются. RRS feed

  • Вопрос

  •  <VolumeScaner_ViewModel:IdToColorConverterAsk  x:Key="IdToColorConvertAsk" />
     <Style x:Key="IdStyleAsk" TargetType="{x:Type DataGridCell}">
      <Setter Property="Background" Value="{Binding ColorAsk, Converter=     {StaticResource IdToColorConvertAsk}}" />
        </Style>
    
    <DataGridTextColumn Binding="{Binding VolumeMtd1AskAllStr}" Header="MtdAsk" Foreground="#FF77F38A" Width="65"  CellStyle="{StaticResource IdStyleAsk}"  FontSize="13.333"/>

    Конвертер имеет вид:

     class IdToColorConverterAsk : System.Windows.DependencyObject, IValueConverter
        {
         public object Convert(object value, Type targetType, object parameter,   CultureInfo culture)
        {
            if (value != null)
            {
                var intValue = (int)value;
    
    
                if (intValue == 1)
                    return MainWindow.ColorsCollect["198,137,165"];
                //return new SolidColorBrush(Color.FromArgb(100, 198, 137, 165));
                if (intValue == 2)
                    return MainWindow.ColorsCollect["Red"];
                //  return new SolidColorBrush(Colors.Red);
    
            }
            return MainWindow.ColorsCollect["Fon"];
            //return new SolidColorBrush(Color.FromArgb(100, 32, 29, 74));
    
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new Exception("The method or operation is not implemented.");
        }
    }

    Класс имеет вид:

    public class Profil : ViewModelBase {   private string _VolumeMtd1AskAllStr;
            public string VolumeMtd1AskAllStr { get { return _VolumeMtd1AskAllStr; } set { if (_VolumeMtd1AskAllStr != value) { _VolumeMtd1AskAllStr = value; OnPropertyChanged("VolumeMtd1AskAllStr"); } } }

     private int _ColorAsk = 0;
            public int ColorAsk { get { return _ColorAsk; } set { if (_ColorAsk != value) { _ColorAsk = value; OnPropertyChanged("VolumeMtd1AskAllStr"); OnPropertyChanged("VolumeMtd1BidAllStr"); } } } }

    Где может быть ошибка? Стоит мышкой DataGrid прокрутить в невидимую часть и обратно и сразу цвета окрашиваются правильно.

    Подсветка идет нескольких экстремальных ячеек столбца по флагу в отдельном свойстве класса.


    Eugene




    20 августа 2013 г. 16:23

Ответы

  • Коллега, если на уточняющие вопросы вы не будите отвечать, то вам помочь не смогут.

    Итак, вопросы которые подразумевают ответы да-нет:

    1. Я правильно понял вас, что вы исправили свойство ColorAsk, теперь у вас там вызывается OnPropertyChanged("ColorAsk");?

    2. Вы поставили точку останова в свойство, убедились, что значение свойства меняется?

    3. Вы поставили точку останова в конвертор и туда не заходит?

    Если ответ будет да, да, нет. То будем думать. Если ответ нет, ..., .... То делайте то что вам советуют, потом если это не поможет рассказывайте что не помогло.

    • Помечено в качестве ответа Евгений771 22 августа 2013 г. 10:35
    22 августа 2013 г. 9:28
    Отвечающий

Все ответы

  • Добрый день!

    Возможно, используя Freezable.

    Посмотрите статью Freezable сведения об объектах и обсуждение "Workaround for WPF Freezable bug?".


       



     

    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    21 августа 2013 г. 12:38
    Модератор
  • У вас когда вызывается OnPropertyChanged для ColorAsk указывается неправильное имя поля. Копипаст - зло.

    21 августа 2013 г. 12:56
    Отвечающий
  • Все правильно, если флаг поменялся то идет изменение ячеек Ask и Bid. Там цвета друг с другом связаны. Отображение изменения флага меня не волнует т к обычно он вообще не выводится.


    Eugene


    21 августа 2013 г. 20:35
  • Ничего не изменилось. Забыл сказать, у меня еще текущая строка подсвечивается :

     class BackgroundConverter : System.Windows.DependencyObject, IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                // TODO: be more careful with nulls and non-expected values
                bool isSelected = (bool)value;
                return isSelected ? MainWindow.ColorsCollect["198,187,137"] : System.Windows.DependencyProperty.UnsetValue;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }

    А как раз на текущей цене и все ячейки меняются. При Refresh все таблицы им уживаться удавалось))

    Какое здесь может быть решение?Может быть после ухода подсветки строки ссо строки выполнить Refresh строки? Есть такая функция и как это сделать в приведенном конвертере?


    Eugene


    21 августа 2013 г. 22:31
  • Я правильно понял вас, что вы исправили свойство ColorAsk, теперь у вас там вызывается OnPropertyChanged("ColorAsk");? Вы поставили точку останова в свойство, убедились, что значение свойства меняется, вы поставили точку останова в конвертор и туда не заходит?
    22 августа 2013 г. 6:45
    Отвечающий
  • В ColorAsk задается флаг цвета:

    если=1, то один цвет

    если=2, то другой цвет, иначе цвет фона т е цвет всех ячеек до применения подсветки.

    Я поставли обработчик событий на изменение значение ColorAsk и при изменение применил OnPropertyChanged к двум столбцам другим. 

    На столбце Ask конвертер [класс IdToColorConverterAsk   ;   Converter=     {StaticResource IdToColorConvertAsk}; стиль Cells:

    CellStyle="{StaticResource IdStyleAsk}"],на биде подобный же конвертер,

    но просто контрольные значения 3 и 4 .


    Eugene



    22 августа 2013 г. 8:24
  • Коллега, если на уточняющие вопросы вы не будите отвечать, то вам помочь не смогут.

    Итак, вопросы которые подразумевают ответы да-нет:

    1. Я правильно понял вас, что вы исправили свойство ColorAsk, теперь у вас там вызывается OnPropertyChanged("ColorAsk");?

    2. Вы поставили точку останова в свойство, убедились, что значение свойства меняется?

    3. Вы поставили точку останова в конвертор и туда не заходит?

    Если ответ будет да, да, нет. То будем думать. Если ответ нет, ..., .... То делайте то что вам советуют, потом если это не поможет рассказывайте что не помогло.

    • Помечено в качестве ответа Евгений771 22 августа 2013 г. 10:35
    22 августа 2013 г. 9:28
    Отвечающий
  • Спасибо, все заработало. Не пойму только OnPropertyChanged же должен применяться к тем столбцам, свойства которых мы хотим обновить, при чем здесь столбец флагов?Или WPF сам в себе варится и реагирует только на изменение столбца флагов и не заменчает изменение флага в Observable Collection?


    Eugene

    22 августа 2013 г. 10:26
  • Коллега, у вас конвертор связан биндингом с каким полем? Правильно с полем ColorAsk. Вы из кода его меняете, а как WPF узнает о том, что поле поменялось и надо вызвать конвертор и переопределить цвет? Правильно, через событие, которое вы вызывали для других свойств. Почитайте вот это, я думаю вам будет полезно.

    P.s. Не забудьте отметить ответ или ответы, которые отвечают на ваш вопрос.

    22 августа 2013 г. 10:30
    Отвечающий