Мне нужен способ для 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}">