Заставить xamDataGrid перерисовать - PullRequest
4 голосов
/ 04 декабря 2011

Мне нужен способ для viewmodel указывать XamDataGrid на представлении просто перечитать и перекрасить его ячейки с минимальными хлопотами.Я не хочу связываться с источником и делать некоторые неустойчивые обходные пути с повышением его событий (источник может измениться).

Чтобы сделать его более понятным, у меня есть глобальный статический класс, который содержит некоторые настройки визуальных подсказок, которые не влияют на данные, а только отображают их в сетке (масштабирование, форматирование и т. Д.).Визуальное действие происходит в реализации IValueConverter, прикрепленной к полю, которая работает просто отлично.Есть статическое событие, которое срабатывает, когда изменяются метки, и на него подписываются модели представления, и события запускаются правильно.Теперь мне просто нужно, чтобы обработчик событий вызывал перерисовку сетки.

Есть предложения?

РЕДАКТИРОВАТЬ: какой-нибудь код, если это поможет:

конвертер:

public class ScaleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType == typeof(double) || targetType == typeof(double?))
        {
            if (value == null && targetType == typeof(double?)) return null;  // short circuit for null->null, nothing to scale
            if (value is double) return (double)value / DisplayScale.Scale; // shortcut for direct scaling, no need to waste time on conversion
            try
            {
                return System.Convert.ToDouble(value) / DisplayScale.Scale; // for convertible values, eat conversion exception
            }
            catch (Exception) {};
            // if all esle fails return NaN
            return double.NaN; 
        }
        // fallthrough, return null, this should not happen, if it does it means converter is incomplete
        return null;
    }
 ...
}

Глобальные поля DisplayScale

public class DisplayScale: NotificationObject
{
    private static KeyValuePair<string, double> _ActiveScaling;
    private static readonly object _lockHandle = new object(); // note: should not contest, but just to be on the safe side
    public static event Action ScalingChanged;

    public static List<KeyValuePair<string, double>> ScaleList { get; private set; }

    static DisplayScale()
    {
        ScaleList = new List<KeyValuePair<string, double>>() 
        { 
            new KeyValuePair<string, double>("No scaling (1's)", 1d),
            new KeyValuePair<string, double>("Thousands (1,000's)", 1000d),
            new KeyValuePair<string, double>("Millions (1,000,000's)", 1000000d),
            new KeyValuePair<string, double>("Billions (1,000,000,000's)", 1000000000d)
         };
        ActiveScaling = ScaleList.First();  // OPTION: could be in per-user config
    }

    public static double Scale { get { return ActiveScaling.Value; } }
    public static KeyValuePair<string, double> ActiveScaling
    {
        get
        {
            lock (_lockHandle) return _ActiveScaling;
        }
        set
        {
            lock (_lockHandle)
            {
                _ActiveScaling = value;
                var eventCall = ScalingChanged;
                if (eventCall != null) eventCall();
            }
        }
    }
}

определены как

// resource
<inf:ScaleConverter x:Key="ScaleConverter" />
// field
<igDP:Field Name="Deposit" Converter="{StaticResource ScaleConverter}">

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

если у вас есть коллекция, чем вызовите ее просто Refresh ().

public class YourViewModel
{
  private ObservableCollection<YourDataClass> yourColl;

  public void YourViewModel()
  {
    yourColl = new ObservableCollection<YourDataClass>();
    YourCollectionView = CollectionViewSource.GetDefaultView(yourColl);
    DisplayScale.ScalingChanged += () => YourCollectionView.Refresh();
  }

  var ICollectionView yourCollView;
  public ICollectionView YourCollectionView
  {
    get { yourCollView; }
    set {
      yourCollView = value;
      RaisePropertyChanged("YourCollectionView");
    }
  }
}
0 голосов
/ 11 октября 2013

У меня была та же проблема , и оказалось, что хотя моя ViewModel и реализовала INotifyPropertyChanged, я не реализовывал INotifyPropertyChanged для класса, с которым связывались строки сетки в моей ObservableCollection (т.е. YourDataClass в ответе punker76).Как только я реализовал его в этом классе, все начало обновляться, как и ожидалось.

Я знаю, что вы упомянули «Я не хочу связываться с источником», поэтому я не уверен, приемлемо ли это решение для вас., но я думал, что поделюсь с другими, которые тоже найдут этот пост.

...