2
0
Эх сурвалжийг харах

Widget ViewModel inheritance

Dexter89 11 жил өмнө
parent
commit
6db07bf588

+ 13 - 3
tools/gui/crown-tests/GtkExt/BindingEngine.cs

@@ -24,9 +24,16 @@ namespace crown_tests.GtkExt
 
 		public static ViewModelBase GetViewModel(Gtk.Widget widget)
 		{
-			ViewModelBase viewModel = null;
-			mViewModels.TryGetValue(widget, out viewModel);
-			return viewModel;
+			var currWidget = widget;
+			while (currWidget != null) {
+				ViewModelBase viewModel = null;
+				if (mViewModels.TryGetValue(currWidget, out viewModel))
+					return viewModel;
+
+				currWidget = currWidget.Parent;
+			}
+
+			return null;
 		}
 
 		public static Binding GetOrCreateBinding(Gtk.Widget widget, Object source, IBindingTarget target, BindingInfo info) 
@@ -80,6 +87,9 @@ namespace crown_tests.GtkExt
 		}
 
 		public Object GetSourceValue() {
+			if (mSource == null)
+				return null;
+
 			var propInfo = mSource.GetType().GetProperty(Info.Path);
 			if (propInfo == null)
 				return null;

+ 1 - 1
tools/gui/crown-tests/GtkExt/BindingTargets/EntryBindingTarget.cs

@@ -30,7 +30,7 @@ namespace crown_tests.GtkExt
 
 		public void Update(Binding binding, object newValue)
 		{
-			mEntry.Text = newValue as String;
+			mEntry.Text = newValue == null ? String.Empty : newValue.ToString();
 		}
 
 		#endregion

+ 9 - 2
tools/gui/crown-tests/MainWindow.cs

@@ -16,7 +16,12 @@ namespace crown_tests
 		{
 			this.Build();
 
+			//Set the ViewModels for each widget
 			var crownTestsViewModel = new CrownTestsViewModel();
+			BindingEngine.SetViewModel(this, crownTestsViewModel);
+			//txtTestFolder and txtCrownTestsExe automatically inherit the view model of the MainWindow because it has not been not specified
+
+			//Create and Apply templates for each widget
 			Templating.ApplyTemplate(twTests,
 				new TreeViewTemplate()
 					.AddColumn("Name", new Gtk.CellRendererText())
@@ -27,11 +32,9 @@ namespace crown_tests
 																						 .SetBinding("Name", "Name")
 																						 .SetBinding("State", "LastResult")));
 
-			BindingEngine.SetViewModel(txtTestFolder, crownTestsViewModel);
 			Templating.ApplyTemplate(txtTestFolder,
 				new EntryTemplate().SetTextBinding("TestFolder"));
 
-			BindingEngine.SetViewModel(txtCrownTestsExe, crownTestsViewModel);
 			Templating.ApplyTemplate(txtCrownTestsExe,
 				new EntryTemplate().SetTextBinding("CrownTestsExe"));
 
@@ -61,6 +64,10 @@ namespace crown_tests
 		private void LoadTestsData()
 		{
 			var testsJsonFullfileName = System.IO.Path.Combine(txtTestFolder.Text, "tests.json");
+			if (!System.IO.File.Exists(testsJsonFullfileName)) {
+				Console.WriteLine("Could not find test data: " + testsJsonFullfileName);
+				return;
+			}
 			mContainer = JsonConvert.DeserializeObject<TestContainer>(System.IO.File.ReadAllText(testsJsonFullfileName));
 
 			RefreshData();