AUXIndexViewModel.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. using Aitex.Core.Common.DeviceData;
  2. using Aitex.Core.Util;
  3. using Caliburn.Micro;
  4. using Caliburn.Micro.Core;
  5. using FurnaceUI.Controls.Common;
  6. using FurnaceUI.Models;
  7. using MECF.Framework.Common.DataCenter;
  8. using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Threading.Tasks;
  13. using System.Windows.Controls;
  14. using System.Windows.Data;
  15. using System.Windows.Input;
  16. using System.Windows.Interactivity;
  17. namespace FurnaceUI.Views.Parameter
  18. {
  19. public class AUXIndexViewModel : FurnaceUIViewModelBase
  20. {
  21. private const string AUX_PATH = "PM1.RecipeEditParameter.AUX";
  22. private const string TABLE = "Table";
  23. #region 构造函数
  24. /// <summary>
  25. /// 构造函数
  26. /// </summary>
  27. public AUXIndexViewModel()
  28. {
  29. }
  30. #endregion
  31. #region 模型字段
  32. #region 属性 IsFirstCheck
  33. public bool IsFirstCheck
  34. {
  35. get { return _isFirstCheck; }
  36. set
  37. {
  38. _isFirstCheck = value;
  39. this.NotifyOfPropertyChange(nameof(IsFirstCheck));
  40. }
  41. }
  42. private bool _isFirstCheck = true;
  43. #endregion
  44. #region 属性 IsSelectConfig
  45. public bool IsSelectConfig
  46. {
  47. get { return _isSelectConfig; }
  48. set
  49. {
  50. _isSelectConfig = value;
  51. this.NotifyOfPropertyChange(nameof(IsSelectConfig));
  52. }
  53. }
  54. private bool _isSelectConfig = true;
  55. #endregion
  56. #region 属性 IsSelectStatus
  57. public bool IsSelectStatus
  58. {
  59. get { return _isSelectStatus; }
  60. set
  61. {
  62. _isSelectStatus = value;
  63. this.NotifyOfPropertyChange(nameof(IsSelectStatus));
  64. }
  65. }
  66. private bool _isSelectStatus = false;
  67. #endregion
  68. #region 属性 TableDataSource
  69. /// <summary>
  70. /// TableDataSource
  71. /// </summary>
  72. public List<ConfigNode> TableDataSource
  73. {
  74. get { return _tableDataSource; }
  75. set
  76. {
  77. _tableDataSource = value;
  78. this.NotifyOfPropertyChange(nameof(TableDataSource));
  79. }
  80. }
  81. private List<ConfigNode> _tableDataSource = new List<ConfigNode>();
  82. #endregion
  83. #region 属性 TableDataSource的显示视图
  84. /// <summary>
  85. /// TableDataSource的显示视图
  86. /// </summary>
  87. public ListCollectionView TableDataViewSource
  88. {
  89. get { return _tableDataViewSource; }
  90. set
  91. {
  92. _tableDataViewSource = value;
  93. NotifyOfPropertyChange("TableDataViewSource");
  94. }
  95. }
  96. private ListCollectionView _tableDataViewSource;
  97. #endregion
  98. #region 属性 AUXNode
  99. private ConfigNode AUXNode { get; set; }
  100. #endregion
  101. #region 属性 TableBtnNodes
  102. /// <summary>
  103. /// TableBtnNodes
  104. /// </summary>
  105. public List<ConfigNode> TableBtnNodes
  106. {
  107. get { return _tableBtnNodes; }
  108. set
  109. {
  110. _tableBtnNodes = value;
  111. this.NotifyOfPropertyChange(nameof(TableBtnNodes));
  112. }
  113. }
  114. private List<ConfigNode> _tableBtnNodes = new List<ConfigNode>();
  115. #endregion
  116. #region 属性 LeftTreeNodes
  117. /// <summary>
  118. /// LeftTreeNodes
  119. /// </summary>
  120. public List<ParamBase> LeftTreeNodes
  121. {
  122. get { return _leftTreeNodes; }
  123. set
  124. {
  125. _leftTreeNodes = value;
  126. this.NotifyOfPropertyChange(nameof(LeftTreeNodes));
  127. }
  128. }
  129. private List<ParamBase> _leftTreeNodes = new List<ParamBase>();
  130. #endregion
  131. private int _statusSelectedIndex;
  132. public int StatusSelectedIndex
  133. {
  134. get => _statusSelectedIndex;
  135. set
  136. {
  137. _statusSelectedIndex = value;
  138. NotifyOfPropertyChange(nameof(StatusSelectedIndex));
  139. }
  140. }
  141. private int _statusIndex;
  142. #region 订阅属性 StatusTableDataSource
  143. [Subscription("PM1.CurrentAuxData")]
  144. public List<AITAuxData> StatusTableDataSource { get; set; }
  145. public List<AITAuxData> ShowStatusTableDataSource { get; set; } = new List<AITAuxData>();
  146. #endregion
  147. #endregion
  148. #region 方法 配置和状态切换
  149. /// <summary>
  150. /// Config/Status 按钮切换
  151. /// </summary>
  152. /// <param name="obj"></param>
  153. public void SwitchListView(object obj)
  154. {
  155. if ("status".Equals(obj.ToString()))
  156. {
  157. IsSelectStatus = true;
  158. IsSelectConfig = false;
  159. }
  160. if ("setting".Equals(obj.ToString()))
  161. {
  162. IsSelectConfig = true;
  163. IsSelectStatus = false;
  164. }
  165. RadioButton radio = new RadioButton();
  166. radio.Content = "Table1";
  167. radio.GroupName = obj.ToString();
  168. TableBtnNodes.FirstOrDefault().IsSelected = true;
  169. SwitchTable(radio);
  170. }
  171. #endregion
  172. #region 方法 切换Table
  173. /// <summary>
  174. /// table切换
  175. /// </summary>
  176. /// <param name="obj"></param>
  177. public void SwitchTable(object obj)
  178. {
  179. var rad = obj as RadioButton;
  180. var tableNameStr = rad.Content.ToString();
  181. var groupName = rad.GroupName.ToString();
  182. if (groupName.ToLower().Contains("status"))
  183. {
  184. // StatusTableDataSource = AllStatusListDataSource.Where(a => a.TableName.Equals(tableNameStr)).ToList();
  185. }
  186. else
  187. {
  188. var tabNode = TableBtnNodes.Find(a => a.Name.Equals(tableNameStr));
  189. TableDataSource = new List<ConfigNode>(tabNode.SubNodes);
  190. TableDataViewSource = new ListCollectionView(TableDataSource);
  191. GetDataOfConfigItems();
  192. }
  193. }
  194. #endregion
  195. #region 方法 选择配置
  196. /// <summary>
  197. /// 选择配置
  198. /// </summary>
  199. /// <param name="obj"></param>
  200. public void SelectionChangedHandle(object obj, object selectedValue)
  201. {
  202. if (obj == null || selectedValue == null)
  203. {
  204. return;
  205. }
  206. ConfigNode node = (ConfigNode)obj;
  207. if (obj == null)
  208. {
  209. return;
  210. }
  211. if (selectedValue is ConfigNode selectedItem)
  212. {
  213. if (obj != selectedItem)
  214. {
  215. return;
  216. }
  217. }
  218. List<ConfigItem> colData = new List<ConfigItem>();
  219. var windowManager = IoC.Get<IWindowManager>();
  220. var colNum = node.Name;
  221. colData = TableDataSource.Where(a => a.Name.Equals(colNum)).FirstOrDefault().Items;
  222. AUXEditViewModel editViewModel = new AUXEditViewModel();
  223. editViewModel.TableNodeItems = colData;
  224. (windowManager as WindowManager)?.ShowDialogWithTitle(editViewModel, null, "Edit AUX");
  225. GetDataOfConfigItems();
  226. }
  227. #endregion
  228. #region 私有方法 数据初始化
  229. /// <summary>
  230. /// 数据初始化
  231. /// </summary>
  232. private void InitData()
  233. {
  234. ConfigNode rootNode = SystemConfigProvider.Instance.GetConfig(true);
  235. AUXNode = FindNodeByName(rootNode, AUX_PATH);
  236. foreach (var item in AUXNode.SubNodes)
  237. {
  238. if (!item.Name.Contains(TABLE))
  239. {
  240. continue;
  241. }
  242. foreach (var tableItem in item.SubNodes)
  243. {
  244. var commonNode = AUXNode.SubNodes.Find(a => a.Name.Equals(tableItem.Name)).Items;
  245. var isInstalledItem = commonNode.OfType<ConfigItem>().Where(p => p.Name == "IsInstalled").FirstOrDefault();
  246. if (isInstalledItem != null)
  247. {
  248. string key = String.Format("{0}{1}{2}", isInstalledItem.Path, ".", isInstalledItem.Name);
  249. isInstalledItem.CurrentValue = SystemConfigProvider.Instance.GetValueByName(key);
  250. }
  251. List<ConfigItem> node = new List<ConfigItem>();
  252. node.AddRange(commonNode);
  253. node.AddRange(tableItem.Items);
  254. tableItem.Items = node;
  255. }
  256. }
  257. //按钮初始化
  258. TableBtnNodes = AUXNode.SubNodes.Where(a => a.Name.Contains(TABLE)).ToList();
  259. TableBtnNodes.FirstOrDefault().IsSelected = true;
  260. //表格数据初始化
  261. TableDataSource = new List<ConfigNode>(TableBtnNodes.FirstOrDefault().SubNodes);
  262. TableDataViewSource = new ListCollectionView(TableDataSource);
  263. GetDataOfConfigItems();
  264. }
  265. #endregion
  266. #region 私有方法 获取配置数据
  267. /// <summary>
  268. /// 获取配置数据
  269. /// </summary>
  270. private void GetDataOfConfigItems()
  271. {
  272. if (TableDataSource == null)
  273. {
  274. return;
  275. }
  276. new Task(() =>
  277. {
  278. Dictionary<string, ConfigItem> keyValuePairs = new Dictionary<string, ConfigItem>();
  279. List<string> getConfigs = new List<string>();
  280. foreach (var item in TableDataSource)
  281. {
  282. foreach (var tableItem in item.Items)
  283. {
  284. var key = $"{tableItem.Path}.{tableItem.Name}";
  285. getConfigs.Add(key);
  286. keyValuePairs.Add(key, tableItem);
  287. }
  288. }
  289. var configs = QueryDataClient.Instance.Service.PollConfig(getConfigs);
  290. foreach (var key in configs.Keys)
  291. {
  292. keyValuePairs[key].CurrentValue = configs[key].ToString();
  293. }
  294. }).Start();
  295. }
  296. #endregion
  297. #region 私有方法 根据名称获取节点
  298. /// <summary>
  299. /// 根据名称获取节点
  300. /// </summary>
  301. /// <param name="parentNode"></param>
  302. /// <param name="strName"></param>
  303. /// <returns></returns>
  304. private ConfigNode FindNodeByName(ConfigNode parentNode, string strName)
  305. {
  306. string strCates = strName.Split('.')[0];
  307. ConfigNode node = parentNode.SubNodes.Find((x) => x.Name == strCates);
  308. if (node == null)
  309. return parentNode;
  310. else
  311. return FindNodeByName(node, strName.Replace(strCates + ".", ""));
  312. }
  313. #endregion
  314. #region 重写方法 初始化
  315. /// <summary>
  316. /// 初始化
  317. /// </summary>
  318. protected override void OnInitialize()
  319. {
  320. base.OnInitialize();
  321. InitData();
  322. }
  323. #endregion
  324. #region 方法 切换到第一行
  325. /// <summary>
  326. /// 切换到第一行
  327. /// </summary>
  328. RelayCommand _moveCurrentToFirstCommand;
  329. public ICommand MoveCurrentToFirstCommand
  330. {
  331. get
  332. {
  333. if (_moveCurrentToFirstCommand == null)
  334. {
  335. _moveCurrentToFirstCommand = new RelayCommand(param => this.MoveCurrentToFirst(), param => this.CanMoveCurrentToFirst());
  336. }
  337. return _moveCurrentToFirstCommand;
  338. }
  339. }
  340. private bool CanMoveCurrentToFirst()
  341. {
  342. return TableDataViewSource?.CurrentPosition > 0;
  343. }
  344. private void MoveCurrentToFirst()
  345. {
  346. if (TableDataViewSource?.CurrentPosition > 0)
  347. {
  348. TableDataViewSource?.MoveCurrentToFirst();
  349. }
  350. }
  351. #endregion
  352. #region 方法 切换到上一行
  353. /// <summary>
  354. /// 切换到上一行
  355. /// </summary>
  356. RelayCommand _moveCurrentToPreviousCommand;
  357. public ICommand MoveCurrentToPrevioustCommand
  358. {
  359. get
  360. {
  361. if (_moveCurrentToPreviousCommand == null)
  362. {
  363. _moveCurrentToPreviousCommand = new RelayCommand(param => this.MoveCurrentToPrevious(), param => this.CanMoveCurrentToPrevious());
  364. }
  365. return _moveCurrentToPreviousCommand;
  366. }
  367. }
  368. private bool CanMoveCurrentToPrevious()
  369. {
  370. return TableDataViewSource?.CurrentPosition > 0;
  371. }
  372. private void MoveCurrentToPrevious()
  373. {
  374. if (TableDataViewSource?.CurrentPosition > 0)
  375. {
  376. TableDataViewSource?.MoveCurrentToPrevious();
  377. }
  378. }
  379. #endregion
  380. #region 方法 切换到下一行
  381. /// <summary>
  382. /// 切换到下一行
  383. /// </summary>
  384. RelayCommand _moveCurrentToNextCommand;
  385. public ICommand MoveCurrentToNextCommand
  386. {
  387. get
  388. {
  389. if (_moveCurrentToNextCommand == null)
  390. {
  391. _moveCurrentToNextCommand = new RelayCommand(param => this.MoveCurrentToNext(), param => this.CanMoveCurrentToNext());
  392. }
  393. return _moveCurrentToNextCommand;
  394. }
  395. }
  396. private bool CanMoveCurrentToNext()
  397. {
  398. bool isEnable = false;
  399. if (TableDataViewSource != null)
  400. {
  401. isEnable = TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1;
  402. }
  403. return isEnable;
  404. }
  405. private void MoveCurrentToNext()
  406. {
  407. if (TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1)
  408. {
  409. TableDataViewSource?.MoveCurrentToNext();
  410. }
  411. }
  412. #endregion
  413. #region 方法 切换到最后一行
  414. /// <summary>
  415. /// 切换到最后一行
  416. /// </summary>
  417. RelayCommand _moveCurrentToLastCommand;
  418. public ICommand MoveCurrentToLastCommand
  419. {
  420. get
  421. {
  422. if (_moveCurrentToLastCommand == null)
  423. {
  424. _moveCurrentToLastCommand = new RelayCommand(param => this.MoveCurrentToLast(), param => this.CanMoveCurrentToLast());
  425. }
  426. return _moveCurrentToLastCommand;
  427. }
  428. }
  429. private bool CanMoveCurrentToLast()
  430. {
  431. bool isEnable = false;
  432. if (TableDataViewSource != null)
  433. {
  434. isEnable = TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1;
  435. }
  436. return isEnable;
  437. }
  438. public void MoveCurrentToLast()
  439. {
  440. if (TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1)
  441. {
  442. TableDataViewSource?.MoveCurrentToLast();
  443. }
  444. }
  445. #endregion
  446. protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)
  447. {
  448. base.InvokeAfterUpdateProperty(data);
  449. if (StatusTableDataSource != null) {
  450. if (ShowStatusTableDataSource == null || ShowStatusTableDataSource.Count == 0)
  451. {
  452. StatusTableDataSource.ToList().ForEach(x => ShowStatusTableDataSource.Add(x));
  453. }
  454. else
  455. {
  456. StatusTableDataSource.ToList().ForEach(x =>
  457. {
  458. var showStatus = ShowStatusTableDataSource.FirstOrDefault(s => s.Index == x.Index);
  459. showStatus.Feedback = x.Feedback;
  460. showStatus.SetPoint = x.SetPoint;
  461. showStatus.WarningLowLimit = x.WarningLowLimit;
  462. showStatus.WarningHighLimit = x.WarningHighLimit;
  463. showStatus.AlarmHighLimit = x.AlarmHighLimit;
  464. showStatus.AlarmLowLimit = x.AlarmLowLimit;
  465. showStatus.InvokePropertyChanged();
  466. });
  467. }
  468. }
  469. }
  470. protected override void InvokeBeforeUpdateProperty(Dictionary<string, object> data)
  471. {
  472. base.InvokeBeforeUpdateProperty(data);
  473. }
  474. }
  475. public class AutoScrollBehavior : Behavior<ListView>
  476. {
  477. protected override void OnAttached()
  478. {
  479. AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
  480. base.OnAttached();
  481. }
  482. protected override void OnDetaching()
  483. {
  484. AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
  485. base.OnDetaching();
  486. }
  487. private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
  488. {
  489. if (sender is ListView listView)
  490. {
  491. if (listView.SelectedItem != null)
  492. {
  493. listView.Dispatcher.BeginInvoke((System.Action)delegate
  494. {
  495. listView.UpdateLayout();
  496. listView.ScrollIntoView(listView.SelectedItem);//在这里使用一的方法
  497. });
  498. }
  499. }
  500. }
  501. }
  502. }