AUXIndexViewModel.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  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. { get=> _statusSelectedIndex;
  134. set
  135. {
  136. _statusSelectedIndex = value;
  137. NotifyOfPropertyChange(nameof(StatusSelectedIndex));
  138. } }
  139. private int _statusIndex;
  140. #region 订阅属性 StatusTableDataSource
  141. [Subscription("PM1.CurrentAuxData")]
  142. public List<AITAuxData> StatusTableDataSource { get; set; }
  143. public List<AITAuxData> ShowStatusTableDataSource { get; set; } = new List<AITAuxData>();
  144. #endregion
  145. #endregion
  146. #region 方法 配置和状态切换
  147. /// <summary>
  148. /// Config/Status 按钮切换
  149. /// </summary>
  150. /// <param name="obj"></param>
  151. public void SwitchListView(object obj)
  152. {
  153. if ("status".Equals(obj.ToString()))
  154. {
  155. IsSelectStatus = true;
  156. IsSelectConfig = false;
  157. }
  158. if ("setting".Equals(obj.ToString()))
  159. {
  160. IsSelectConfig = true;
  161. IsSelectStatus = false;
  162. }
  163. RadioButton radio = new RadioButton();
  164. radio.Content = "Table1";
  165. radio.GroupName = obj.ToString();
  166. TableBtnNodes.FirstOrDefault().IsSelected = true;
  167. SwitchTable(radio);
  168. }
  169. #endregion
  170. #region 方法 切换Table
  171. /// <summary>
  172. /// table切换
  173. /// </summary>
  174. /// <param name="obj"></param>
  175. public void SwitchTable(object obj)
  176. {
  177. var rad = obj as RadioButton;
  178. var tableNameStr = rad.Content.ToString();
  179. var groupName = rad.GroupName.ToString();
  180. if (groupName.ToLower().Contains("status"))
  181. {
  182. // StatusTableDataSource = AllStatusListDataSource.Where(a => a.TableName.Equals(tableNameStr)).ToList();
  183. }
  184. else
  185. {
  186. var tabNode = TableBtnNodes.Find(a => a.Name.Equals(tableNameStr));
  187. TableDataSource = new List<ConfigNode>(tabNode.SubNodes);
  188. TableDataViewSource = new ListCollectionView(TableDataSource);
  189. GetDataOfConfigItems();
  190. }
  191. }
  192. #endregion
  193. #region 方法 选择配置
  194. /// <summary>
  195. /// 选择配置
  196. /// </summary>
  197. /// <param name="obj"></param>
  198. public void SelectionChangedHandle(object obj, object selectedValue)
  199. {
  200. if (obj == null || selectedValue == null)
  201. {
  202. return;
  203. }
  204. ConfigNode node = (ConfigNode)obj;
  205. if (obj == null)
  206. {
  207. return;
  208. }
  209. if (selectedValue is ConfigNode selectedItem)
  210. {
  211. if (obj != selectedItem)
  212. {
  213. return;
  214. }
  215. }
  216. List<ConfigItem> colData = new List<ConfigItem>();
  217. var windowManager = IoC.Get<IWindowManager>();
  218. var colNum = node.Name;
  219. colData = TableDataSource.Where(a => a.Name.Equals(colNum)).FirstOrDefault().Items;
  220. AUXEditViewModel editViewModel = new AUXEditViewModel();
  221. editViewModel.TableNodeItems = colData;
  222. (windowManager as WindowManager)?.ShowDialogWithTitle(editViewModel, null, "Edit AUX");
  223. GetDataOfConfigItems();
  224. }
  225. #endregion
  226. #region 私有方法 数据初始化
  227. /// <summary>
  228. /// 数据初始化
  229. /// </summary>
  230. private void InitData()
  231. {
  232. ConfigNode rootNode = SystemConfigProvider.Instance.GetConfig(true);
  233. AUXNode = FindNodeByName(rootNode, AUX_PATH);
  234. foreach (var item in AUXNode.SubNodes)
  235. {
  236. if (!item.Name.Contains(TABLE))
  237. {
  238. continue;
  239. }
  240. foreach (var tableItem in item.SubNodes)
  241. {
  242. var commonNode = AUXNode.SubNodes.Find(a => a.Name.Equals(tableItem.Name)).Items;
  243. List<ConfigItem> node = new List<ConfigItem>();
  244. node.AddRange(commonNode);
  245. node.AddRange(tableItem.Items);
  246. tableItem.Items = node;
  247. }
  248. }
  249. //按钮初始化
  250. TableBtnNodes = AUXNode.SubNodes.Where(a => a.Name.Contains(TABLE)).ToList();
  251. TableBtnNodes.FirstOrDefault().IsSelected = true;
  252. //表格数据初始化
  253. TableDataSource = new List<ConfigNode>(TableBtnNodes.FirstOrDefault().SubNodes);
  254. TableDataViewSource = new ListCollectionView(TableDataSource);
  255. GetDataOfConfigItems();
  256. }
  257. #endregion
  258. #region 私有方法 获取配置数据
  259. /// <summary>
  260. /// 获取配置数据
  261. /// </summary>
  262. private void GetDataOfConfigItems()
  263. {
  264. if (TableDataSource == null)
  265. {
  266. return;
  267. }
  268. new Task(() =>
  269. {
  270. Dictionary<string, ConfigItem> keyValuePairs = new Dictionary<string, ConfigItem>();
  271. List<string> getConfigs = new List<string>();
  272. foreach (var item in TableDataSource)
  273. {
  274. foreach (var tableItem in item.Items)
  275. {
  276. var key = $"{tableItem.Path}.{tableItem.Name}";
  277. getConfigs.Add(key);
  278. keyValuePairs.Add(key, tableItem);
  279. }
  280. }
  281. var configs = QueryDataClient.Instance.Service.PollConfig(getConfigs);
  282. foreach (var key in configs.Keys)
  283. {
  284. keyValuePairs[key].CurrentValue = configs[key].ToString();
  285. }
  286. }).Start();
  287. }
  288. #endregion
  289. #region 私有方法 根据名称获取节点
  290. /// <summary>
  291. /// 根据名称获取节点
  292. /// </summary>
  293. /// <param name="parentNode"></param>
  294. /// <param name="strName"></param>
  295. /// <returns></returns>
  296. private ConfigNode FindNodeByName(ConfigNode parentNode, string strName)
  297. {
  298. string strCates = strName.Split('.')[0];
  299. ConfigNode node = parentNode.SubNodes.Find((x) => x.Name == strCates);
  300. if (node == null)
  301. return parentNode;
  302. else
  303. return FindNodeByName(node, strName.Replace(strCates + ".", ""));
  304. }
  305. #endregion
  306. #region 重写方法 初始化
  307. /// <summary>
  308. /// 初始化
  309. /// </summary>
  310. protected override void OnInitialize()
  311. {
  312. base.OnInitialize();
  313. InitData();
  314. }
  315. #endregion
  316. #region 方法 切换到第一行
  317. /// <summary>
  318. /// 切换到第一行
  319. /// </summary>
  320. RelayCommand _moveCurrentToFirstCommand;
  321. public ICommand MoveCurrentToFirstCommand
  322. {
  323. get
  324. {
  325. if (_moveCurrentToFirstCommand == null)
  326. {
  327. _moveCurrentToFirstCommand = new RelayCommand(param => this.MoveCurrentToFirst(), param => this.CanMoveCurrentToFirst());
  328. }
  329. return _moveCurrentToFirstCommand;
  330. }
  331. }
  332. private bool CanMoveCurrentToFirst()
  333. {
  334. return TableDataViewSource?.CurrentPosition > 0;
  335. }
  336. private void MoveCurrentToFirst()
  337. {
  338. if (TableDataViewSource?.CurrentPosition > 0)
  339. {
  340. TableDataViewSource?.MoveCurrentToFirst();
  341. }
  342. }
  343. #endregion
  344. #region 方法 切换到上一行
  345. /// <summary>
  346. /// 切换到上一行
  347. /// </summary>
  348. RelayCommand _moveCurrentToPreviousCommand;
  349. public ICommand MoveCurrentToPrevioustCommand
  350. {
  351. get
  352. {
  353. if (_moveCurrentToPreviousCommand == null)
  354. {
  355. _moveCurrentToPreviousCommand = new RelayCommand(param => this.MoveCurrentToPrevious(), param => this.CanMoveCurrentToPrevious());
  356. }
  357. return _moveCurrentToPreviousCommand;
  358. }
  359. }
  360. private bool CanMoveCurrentToPrevious()
  361. {
  362. return TableDataViewSource?.CurrentPosition > 0;
  363. }
  364. private void MoveCurrentToPrevious()
  365. {
  366. if (TableDataViewSource?.CurrentPosition > 0)
  367. {
  368. TableDataViewSource?.MoveCurrentToPrevious();
  369. }
  370. }
  371. #endregion
  372. #region 方法 切换到下一行
  373. /// <summary>
  374. /// 切换到下一行
  375. /// </summary>
  376. RelayCommand _moveCurrentToNextCommand;
  377. public ICommand MoveCurrentToNextCommand
  378. {
  379. get
  380. {
  381. if (_moveCurrentToNextCommand == null)
  382. {
  383. _moveCurrentToNextCommand = new RelayCommand(param => this.MoveCurrentToNext(), param => this.CanMoveCurrentToNext());
  384. }
  385. return _moveCurrentToNextCommand;
  386. }
  387. }
  388. private bool CanMoveCurrentToNext()
  389. {
  390. bool isEnable = false;
  391. if (TableDataViewSource != null)
  392. {
  393. isEnable = TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1;
  394. }
  395. return isEnable;
  396. }
  397. private void MoveCurrentToNext()
  398. {
  399. if (TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1)
  400. {
  401. TableDataViewSource?.MoveCurrentToNext();
  402. }
  403. }
  404. #endregion
  405. #region 方法 切换到最后一行
  406. /// <summary>
  407. /// 切换到最后一行
  408. /// </summary>
  409. RelayCommand _moveCurrentToLastCommand;
  410. public ICommand MoveCurrentToLastCommand
  411. {
  412. get
  413. {
  414. if (_moveCurrentToLastCommand == null)
  415. {
  416. _moveCurrentToLastCommand = new RelayCommand(param => this.MoveCurrentToLast(), param => this.CanMoveCurrentToLast());
  417. }
  418. return _moveCurrentToLastCommand;
  419. }
  420. }
  421. private bool CanMoveCurrentToLast()
  422. {
  423. bool isEnable = false;
  424. if (TableDataViewSource != null)
  425. {
  426. isEnable = TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1;
  427. }
  428. return isEnable;
  429. }
  430. public void MoveCurrentToLast()
  431. {
  432. if (TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1)
  433. {
  434. TableDataViewSource?.MoveCurrentToLast();
  435. }
  436. }
  437. #endregion
  438. protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)
  439. {
  440. base.InvokeAfterUpdateProperty(data);
  441. if (ShowStatusTableDataSource == null || ShowStatusTableDataSource.Count == 0)
  442. {
  443. StatusTableDataSource.ToList().ForEach(x => ShowStatusTableDataSource.Add(x));
  444. }
  445. else
  446. {
  447. StatusTableDataSource.ToList().ForEach(x =>
  448. {
  449. var showStatus = ShowStatusTableDataSource.FirstOrDefault(s => s.Index == x.Index);
  450. showStatus.Feedback = x.Feedback;
  451. showStatus.SetPoint = x.SetPoint;
  452. showStatus.WarningLowLimit = x.WarningLowLimit;
  453. showStatus.WarningHighLimit = x.WarningHighLimit;
  454. showStatus.AlarmHighLimit = x.AlarmHighLimit;
  455. showStatus.AlarmLowLimit = x.AlarmLowLimit;
  456. showStatus.InvokePropertyChanged();
  457. });
  458. }
  459. }
  460. protected override void InvokeBeforeUpdateProperty(Dictionary<string, object> data)
  461. {
  462. base.InvokeBeforeUpdateProperty(data);
  463. }
  464. }
  465. public class AutoScrollBehavior : Behavior<ListView>
  466. {
  467. protected override void OnAttached()
  468. {
  469. AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
  470. base.OnAttached();
  471. }
  472. protected override void OnDetaching()
  473. {
  474. AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
  475. base.OnDetaching();
  476. }
  477. private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
  478. {
  479. if (sender is ListView listView)
  480. {
  481. if (listView.SelectedItem != null)
  482. {
  483. listView.Dispatcher.BeginInvoke((System.Action)delegate
  484. {
  485. listView.UpdateLayout();
  486. listView.ScrollIntoView(listView.SelectedItem);//在这里使用一的方法
  487. });
  488. }
  489. }
  490. }
  491. }
  492. }