Sic02-new/FrameworkLocal/RTCore/Backend/BackendSCConfigView.xaml.cs

179 lines
5.5 KiB
C#

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Aitex.Core.RT.SCCore;
using Aitex.Core.UI.MVVM;
namespace MECF.Framework.RT.Core.Backend
{
public class NotifiableSCConfigItem : SCConfigItem, INotifyPropertyChanged
{
public string SetPoint { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
public void InvokePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public void InvokePropertyChanged()
{
PropertyInfo[] ps = this.GetType().GetProperties();
foreach (PropertyInfo p in ps)
{
InvokePropertyChanged(p.Name);
if (p.PropertyType == typeof(ICommand))
{
DelegateCommand<string> cmd = p.GetValue(this, null) as DelegateCommand<string>;
if (cmd != null)
cmd.RaiseCanExecuteChanged();
}
}
FieldInfo[] fi = this.GetType().GetFields();
foreach (FieldInfo p in fi)
{
InvokePropertyChanged(p.Name);
if (p.FieldType == typeof(ICommand))
{
DelegateCommand<string> cmd = p.GetValue(this) as DelegateCommand<string>;
if (cmd != null)
cmd.RaiseCanExecuteChanged();
}
}
}
}
public class BackendSCConfigViewModel : ViewModelBase
{
private List<SCConfigItem> _scItems;
public ObservableCollection<NotifiableSCConfigItem> ScItemList { get; set; }
public ICommand SetScCommand { get; set; }
public ICommand ReloadCommand { get; set; }
public BackendSCConfigViewModel()
{
Init();
SetScCommand = new DelegateCommand<string>(SetSc);
ReloadCommand = new DelegateCommand<string>(Reload);
}
private void SetSc(string obj)
{
NotifiableSCConfigItem item = ScItemList.First(x => x.PathName == obj);
if (item.Type != SCConfigType.String.ToString() && string.IsNullOrEmpty(item.SetPoint))
return;
SC.SetItemValueFromString(obj, item.SetPoint == null ? "" : item.SetPoint);
item.BoolValue = SC.GetConfigItem(obj).BoolValue;
item.IntValue = SC.GetConfigItem(obj).IntValue;
item.StringValue = SC.GetConfigItem(obj).StringValue;
item.DoubleValue = SC.GetConfigItem(obj).DoubleValue;
item.InvokePropertyChanged(nameof(item.Value));
}
public void Reload(string obj)
{
foreach (var item in ScItemList)
{
item.BoolValue = SC.GetConfigItem(item.PathName).BoolValue;
item.IntValue = SC.GetConfigItem(item.PathName).IntValue;
item.StringValue = SC.GetConfigItem(item.PathName).StringValue;
item.DoubleValue = SC.GetConfigItem(item.PathName).DoubleValue;
item.InvokePropertyChanged(nameof(item.Value));
}
}
void Init()
{
if (_scItems != null)
return;
{
_scItems = SC.GetItemList();
ScItemList = new ObservableCollection<NotifiableSCConfigItem>();
foreach (var scItem in _scItems)
{
ScItemList.Add(new NotifiableSCConfigItem()
{
BoolValue = scItem.BoolValue,
Default = scItem.Default,
Description = scItem.Description,
DoubleValue = scItem.DoubleValue,
IntValue = scItem.IntValue,
Max = scItem.Max,
Min = scItem.Min,
Name = scItem.Name,
Type = scItem.Type,
Tag = scItem.Tag,
Parameter = scItem.Parameter,
Path = scItem.Path,
SetPoint = scItem.Value.ToString(),
StringValue = scItem.StringValue,
});
}
}
}
}
/// <summary>
/// SCConfigView.xaml 的交互逻辑
/// </summary>
public partial class BackendSCConfigView : UserControl
{
public BackendSCConfigView()
{
InitializeComponent();
this.Loaded += SCConfigView_Loaded;
this.IsVisibleChanged += BackendSCConfigView_IsVisibleChanged;
}
private void BackendSCConfigView_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.DataContext == null)
{
DataContext = new BackendSCConfigViewModel();
}
(this.DataContext as BackendSCConfigViewModel).Reload(null);
}
private void SCConfigView_Loaded(object sender, RoutedEventArgs e)
{
if (this.DataContext == null)
{
DataContext = new BackendSCConfigViewModel();
}
}
}
}