Пробую тут разобраться с WPF в целях получения экспы. Ну и заодно нарисовать симпатичную мордочку к ардуине, которая будет мониторить температуру, двери и прочая.
Вкратце: ардуина на компорт шлет показание датчиков в xml, я его заливаю в свойства соответствующих членов ObservableCollection и хочу, чтобы это все отображалось в WPF-гриде.
Сперва сделал на значение каждого датчика отдельное property, к каждому из них TextBox - и все прекрасно работало. Но было не очень красиво в плане добавления новых датчиков. А они 100% будут.
Решил делать это все маленько масштабируемым. И перейти на ObservableCollection+DataGrid. И тут столкнулся с проблемой.
Что делаю. 1. Объект:
public class Sensor: INotifyPropertyChanged
{
private decimal _value;
public string SensorName;
public string ShortName;
public decimal SensorValue
{
get { return _value; }
set
{
_value = value;
OnPropertyChanged();
}
}
public Type SensorType;
public virtual string DisplayValue
{
get { return SensorValue.ToString(CultureInfo.InvariantCulture); }
}
public override string ToString()
{
return string.Concat(SensorName, ": ", DisplayValue);
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
2. Данные:
internal class SensorData : INotifyPropertyChanged
{
private string _rawData;
public SensorData()
{
Sensors = new ObservableCollection<Sensor>
{
new Sensor
{
SensorName = "Temperature",
ShortName = "Temp",
},
new Sensor
{
SensorName = "Door",
ShortName = "Door",
},
new Sensor
{
SensorName = "Gas",
ShortName = "Gas",
}
};
}
private Collection<Sensor> _sensors;
public Collection<Sensor> Sensors {
get
{
return _sensors;
}
set
{
_sensors = value;
OnPropertyChanged("Sensors");
}
}
public string RawData
{
set
{
_rawData = value;
var xml = new XmlDocument();
xml.LoadXml(_rawData);
var root = xml.DocumentElement;
foreach (Sensor sensor in Sensors)
{
if (root.ChildNodes != null)
{
foreach(XmlNode node in root.ChildNodes)
if (node.Name.ToLower() == sensor.SensorName.ToLower())
{
decimal newValue;
Decimal.TryParse(node.InnerText, out newValue);
sensor.SensorValue = newValue;
}
}
}
}
get { return _rawData; }
}
public override string ToString()
{
string _retval = "";
foreach (var sensor in Sensors)
{
_retval += string.Format("{0}: {1},", sensor.ShortName, sensor.DisplayValue);
}
return _retval;
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Отдельным потоком крутится чтение XML с ардуины и запись в SensorData.RawData. Это работает, значения обновляются, проверял.
Он у тебя слушает изменение DisplayValue, а изменяешь ты соответственно другое свойство ) Как вариант при изменении числового свойства вызывай OnPropertyChange c параметром DisplayValue.
P.S. За CultureInfo.InvariantCulture обычно бьют по рукам Для UI нужно использовать CurrentCulture )
Он у тебя слушает изменение DisplayValue, а изменяешь ты соответственно другое свойство ) Как вариант при изменении числового свойства вызывай OnPropertyChange c параметром DisplayValue.
Спасибо, добрый человек Затупил я. И с отображением наименования тоже - забыл, что биндятся только свойства, а не поля.
P.S. За CultureInfo.InvariantCulture обычно бьют по рукам Для UI нужно использовать CurrentCulture )
Что-то было такое с парсингом у меня, что заставило использовать Invariant... не помню
Ну, у меня уже не WPF, но тему новую плодить не хочется.
Камрады, помогайте. Начальством дана боевая задача зафигачить тестовую среду для пяти километровых хранимок на T-SQL. Чтобы в случае обновления мы тесты накатили - и увидели, не наступил ли глобальный пц. Они обновляют кучу таблиц, стартуют другие хранимки и прочая. Пока нарыл фреймворк tSQLt, вроде более-менее то. Но может у кого есть практический опыт в этом деле?