0

我想我错误地问了我的问题,因此有一些错误的代码。我想要做的是拥有更多的 Model-Controller(?)-ViewModel-View,我在控制器中可以拥有在多个 ViewModel 中使用的代码,因此我不必多次编写它。我无法掌握的部分是如何在控制器类的循环中更新 ViewModel。控制器有一个循环计数器,我想用它来更新 ViewModel 中的参数,但在我返回 ViewModel 之前不会更新。

我试图弄清楚如何使用 Prism 从模型更新 Viewmodel。我可能做错了,但我认为我可以让我的类成为一个可绑定的基础,然后让它在修改时自动更新我的视图模型,而不是使用 INotifyPropertyChanged。

我有一种方法可以遍历一些目录并跟踪一些文件。我想让循环更新一个实时更新视图模型的字段,因为我正在使用 BindableBase 我相信我应该能够使用它来通知 ViewModel 模型的更新。现在代码不会自动更新 ViewModel,因为我对如何完成这项任务有点迷茫。

视图模型

public class P4LabelBatteryViewModel : BindableBase
    {
        private P4LabelBatteryModel p4LabelBatteryModel = new P4LabelBatteryModel();
        private ScriptsToTagModel scriptsToTagModel = new ScriptsToTagModel();
        private P4LabelBattery.Models.BatteryLocation batteryLocation = new BatteryLocation();


        public P4LabelBatteryViewModel()
        {
           P4LabelBattery.Models.BatteryLocation  p4LabelBattery = new BatteryLocation();

           // FilesProcessedBlck = p4LabelBattery.TestItem;


            this.GetBatteryBtn = new DelegateCommand(chooseFile, canChooseFile);
            this.NewLabelBtn = new DelegateCommand(chooseNewLabel, canNewLabel).ObservesProperty(() => NewLabel);
        }


        private string _batteryLocation = "Enter Location Here";
        public string BatteryLocation
        {
            get
            {
                return _batteryLocation;
            }
            set
            {
                SetProperty(ref _batteryLocation, value);
            }
        }

        public ICommand GetBatteryBtn
        {
            get;
            set;
        }


        private void chooseFile()
        {
            BatteriesToLoad = p4LabelBatteryModel.GetBatteryFileName();

            var b = BatteriesToLoad.Count;
            if (b != 0)
            {
                ScriptCollection = scriptsToTagModel.ReadInScrpts(BatteriesToLoad[b-1].BatteryLocationAdd);
                BatteryLocation = BatteriesToLoad[b - 1].BatteryLocationAdd;
            }
        }

        private bool canChooseFile()
        {
            if (BatteriesToLoad != null)
            {
                return true;
            }
            else
            {
                return true;
            }
        }


        public ICommand NewLabelBtn
        {
            get;
            set;
        }

        private void chooseNewLabel()
        {
            if (ScriptCollection.Count > 0)
            {
                ScriptCollection = P4LabelBatteryModel.LocatePNGModel(NewLabel, ScriptCollection, batteryLocation);
//                FilesProcessedBlck = ScriptCollection.Count;
                ScriptCollection = P4LabelBatteryModel.TagsFilesModel(NewLabel, ScriptCollection, FilesProcessedBlck);
            }
        }

        private bool canNewLabel()
        {
            if (NewLabel == null || NewLabel == "Enter Label Here" || NewLabel == "")
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        private string _newLabel;
        public string NewLabel
        {
            get
            {
               return _newLabel;
            }
            set
            {
                SetProperty(ref _newLabel, value);
                canNewLabel();
            }
        }

        private int _filesProcessedBlck;
        public int FilesProcessedBlck
        {
            get
            {
                return _filesProcessedBlck;
            }
            set
            {
                SetProperty(ref _filesProcessedBlck, batteryLocation.TestItem);
            }

        }


        private ObservableCollection<ScriptModel> _scriptCollection = new ObservableCollection<ScriptModel>();
        public ObservableCollection<ScriptModel> ScriptCollection
        {
            get
            {
                return _scriptCollection;
            }
            set
            {
                SetProperty(ref _scriptCollection, value);
            }

        }

        private ObservableCollection<BatteryLocation> _batteriesToLoad = new ObservableCollection<BatteryLocation>();
        public ObservableCollection<BatteryLocation> BatteriesToLoad 
        {
            get
            {
                return _batteriesToLoad;
            }
            set
            {
                SetProperty(ref _batteriesToLoad, value);
            }

        }



    }

模型:

class P4LabelBatteryModel : BindableBase
    {
        private string _MasterFile2 = "0";
        private ObservableCollection<BatteryLocation> batteryLocationColl = new ObservableCollection<BatteryLocation>();

        public ObservableCollection<BatteryLocation> GetBatteryFileName()
        {
            if (_MasterFile2 != "1")
            {
                Microsoft.Win32.OpenFileDialog _MasterFileDialog = new Microsoft.Win32.OpenFileDialog();

                _MasterFileDialog.DefaultExt = "*.*";
             //   _MasterFileDialog.Filter = "All Files (*.scr; *.SCR) | *.scr; *.SR";

                Nullable<bool> result = _MasterFileDialog.ShowDialog();

                BatteryLocation batteryLocation = new BatteryLocation();
                batteryLocation.BatteryLocationAdd =  _MasterFileDialog.FileName;

                if (result == true && !batteryLocationColl.Contains(batteryLocation))
                {
                    batteryLocation.BatteryLocationAdd = _MasterFileDialog.FileName;
                    batteryLocationColl.Add(batteryLocation);
                }
            }
                return batteryLocationColl;
        }

        public static ObservableCollection<ScriptModel> LocatePNGModel(string NewLabel, ObservableCollection<ScriptModel> observableCollection, BatteryLocation FilesProcessedBlck)
        {
            string newLabel = NewLabel;
            var scriptsToTagColl = observableCollection;
            string[] files = null;
            FilesProcessedBlck.TestItem = 40;

            // ObservableCollection<ScriptModel> newCollection = new ObservableCollection<ScriptModel>();

            int CollCount = scriptsToTagColl.Count;
            for (int i = 0; i < CollCount; i++)
            {

                //Check for 4th occurance of \ to search for .png files.
                // Modify path for non-standard script locations.
                if (!scriptsToTagColl[i].ScriptNameAdd.Contains("Scripts"))
                {
                    int j = 0;
                    int m = 0;

                    for (int k = 0; k <= 4 && k < scriptsToTagColl[i].ScriptNameAdd.Count(); k++)
                    {
                        if (j != -1)
                        {
                            if ((j = scriptsToTagColl[i].ScriptNameAdd.IndexOf(@"\", j)) != -1 && k == 4)
                            {
                                //add directory search for .png
                                string teststring = scriptsToTagColl[i].ScriptNameAdd;
                                int testint = teststring.Count();
                                int ttt = testint;
                                string _edtdString = teststring.Remove(j, testint - j);
                                try
                                {
                                    foreach (string d in Directory.GetDirectories(_edtdString))
                                    {
                                        try
                                        {

                                            files = Directory.GetFiles(d, "*.png", SearchOption.AllDirectories);

                                            foreach (string file1 in files)
                                            {
                                                ScriptModel _scriptModel = new ScriptModel();
                                                _scriptModel.ScriptNameAdd = file1;
                                                scriptsToTagColl.Add(_scriptModel);
                                              //  newCollection.Add(_scriptModel);
                                            }
                                        }
                                        catch (Exception e)
                                        {
                                            //don't care right now.
                                            //files = null;
                                            //testscript2 = testscript.Insert(index + @"Scripts\".Length, @"Results\");
                                            //trimmed = testscript.TrimEnd('.', 's', 'c', 'r');
                                            //trimmed += @"\mill\Snapshots\BCM";
                                            int stophere = 2;


                                        }

                                    }
                                }
                                catch (Exception e)
                                {
                                    //don't care right now
                                    int stophere2 = 2;
                                }

                                break;
                            }
                            j++;
                        }
                    }
                }
                //End of check
                else
                {
                    string testscript = scriptsToTagColl[i].ScriptNameAdd;
                    int index = testscript.IndexOf(@"Scripts\");
                    files = null;
                    string testscript2 = testscript.Insert(index + @"Scripts\".Length, @"Results\");
                    string trimmed = testscript2.TrimEnd('.', 's', 'c', 'r');
                    trimmed += @"\mill\Snapshots\BCM";

                    if (Directory.Exists(@trimmed))
                    {
                        try
                        {

                            files = Directory.GetFiles(@trimmed, "*.*");

                            foreach (string file1 in files)
                            {
                                ScriptModel _scriptModel = new ScriptModel();
                                _scriptModel.ScriptNameAdd = file1;
                          //      newCollection.Add(_scriptModel);
                                scriptsToTagColl.Add(_scriptModel);
                            }
                        }
                        catch (Exception e)
                        {
                            //don't care right now.
                            files = null;
                            testscript2 = testscript.Insert(index + @"Scripts\".Length, @"Results\");
                            trimmed = testscript.TrimEnd('.', 's', 'c', 'r');
                            trimmed += @"\mill\Snapshots\BCM";


                        }
                    }
                }

            }

            return scriptsToTagColl;
        }

        public static ObservableCollection<ScriptModel> TagsFilesModel(string NewLabel, IList<ScriptModel> observableCollection, int FileCount)
        {
            string newLabel = NewLabel;
            var scriptsToTagColl = observableCollection;
            int fileCount = FileCount;

            var _p4LabelBatteryViewModel = new P4LabelBatteryViewModel();

            //This will generate an IPC when returned
            ObservableCollection<ScriptModel> newCollection = new ObservableCollection<ScriptModel>();

            int CollCount = scriptsToTagColl.Count;

            for (int i = 0; i < scriptsToTagColl.Count; i++)
            {
                var stringToTest = scriptsToTagColl[i].ScriptNameAdd;
               string tempString = @" """;

              //  if (stringToTest.Contains(" "))
              //  {
                    tempString = tempString + stringToTest;
                    stringToTest = " " + tempString;
             //   }


                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                StringBuilder q = new StringBuilder();

                string FileName1 = @"c:\windows\system32\cmd.exe";
                string Arguments1 = string.Format("@ /c p4 tag -l {0} {1}", newLabel, stringToTest);

               proc.StartInfo = new ProcessStartInfo(FileName1, Arguments1);
               proc.StartInfo.RedirectStandardError = true;
               proc.StartInfo.UseShellExecute = false;
               proc.StartInfo.CreateNoWindow = true;
               proc.Start();

               q.Append(proc.StandardError.ReadToEnd());
                //while (!proc.HasExited)
                //{
                //    q.Append(proc.StandardOutput.ReadToEnd());

                //}
                string r = q.ToString();  

                if ( ! r.Contains("no such file(s)"))
                {
                scriptsToTagColl[i].BackGround = new SolidColorBrush(Colors.LightGreen);
                }

                newCollection.Add(scriptsToTagColl[i]);
            }

            return newCollection;
        }
    }

    public class BatteryLocation :BindableBase
    {
        private string _batteryLocationAdd;

        public string BatteryLocationAdd
        {
            get { return _batteryLocationAdd; }
            set { _batteryLocationAdd = value; }
        }

        private SolidColorBrush _backGround;
        public SolidColorBrush BackGround
        {
            get { return _backGround; }
            set { _backGround = value; }
        }

        private int _testItem = 100;
        public int TestItem
        {
            get {return _testItem;}
            set { _testItem = value; }

        }

    }

}
4

0 回答 0