How can I debug issues related to lazy-properties? - bixby

I'm unable to see any logs related to the lazy-source Action that is defined in lazy properties.

Lazy properties, defined by the lazy-source key are populated only when necessary. The lazy property is associated with a Fetch Action, which is called asynchronously and on demand, to populate the lazy property. Bixby would call this Action, for example, in Details layouts or specific dialogs for structures.
At the moment, any debugging information related to this Fetch Action is not available in the debugger. 
Details
The ability to debug lazy properties is currently not available in the IDE. There are plans to implement it in the future but no timeline is available at the moment.
Workaround
Developers can workaround this issue by creating a custom intent that they can run in the simulator. This will then show the related information in the debugger.  
In the following example, WineDescription is a lazy property of the Concept Wine that is populated by the Action GetWineDescription. Wine is returned as the Output by the Action FindWine. To get the debugger to show up information related to GetWineDescription, here is the custom intent:
intent {
goal: WineDescription
subplan {
goal: Wine
route: FindWine
}
}

Related

Catel Edit Master-Detail View multiple times

I'm trying to edit a Master-Detail View multiple times in Catel.
My question is, if there is no common way in catel to handle a Master-Detail-View and multiple editions using the SaveViewModelAsync and CancelViewModelAsync methods?
The workflow works when my Master-ListItem is no UserControl with it's own ViewModel and when I change the selected Master-ListItem after save or cancel, so that a new ViewModel will be created. But I don't want to null or change the selection after a save/cancel. Also I have maybe to create a UserControl + ViewModel for the Master-ListItems.
Restrictions of the question:
I have got the information from Geert van Horrik from the discussion of his answer, that
multiple edit cycles are not supported directly
one Model should only be accesd by one ViewModel
Problem:
I can use the the SaveViewModelAsync and CancelViewModelAsync only once. After that, the ViewModels which are alive
will get no updates from the Model
don't create a BackUp from the Data, so that the changes can be reverted again
Code to Reproduce:
I have created a WPF Project, where I tested this all.
Possible solution:
I could use the EditableObjectHelper and handle this by myself
I have to instantiate the VewModel again, after the save or cancel, like it happends on a selection change in my Example Code
Restricion of the solution:
If I use a specialized UserControl for the ListItems of the Master-View, 2 ViewModels are looking on 1 Model. After the SaveViewModelAsync the ViewModel doesn't get any Notifications of the Model. So I would have to instantiate this ViewModel again too. But I would Breake the 1-1 relation of the ViewModel-Model.
My conclusion:
It seems, that I have to instantiate all these ViweModels and handle this workflow all by myself. It seems, that the ViewModelLifetimeManagement.PartlyManual (CloseViewModelOnUnloaded is Obsolete) doesn't work here. On selection change, always a new ViewModel will be created, the old one will probably just not be closed.
I don't want to misuse the framework. Maybe I have missed something. I hope somebody can help me or give me a tip, how to handle this.
Catel calls Save / Cancel as soon as the view model get's unloaded. If you want to do "intermediate" saves without changing the data model, you can:
Save the master list which will save the dirty models (you can directly modify the models from within your vm's)
Create a custom command (SaveData) that you can run from an explicit button (or input gesture binding) to save the data without calling SaveAsync on the vm
After the answer of Geert van Horrik, I currently ended up , don't using the SaveViewModelAsync and CancelViewModelAsync methods and handle the save and cancel by my own, so that the notification will not breake. I'm using the GetChildViewModels() method on the ViewModelBase and the EditableObjectHelper.CancelEditObject(Model);

Visual State name in ViewModel Best Practice

I'm new to Windows Universal app programming. Decided to use Tmeplate10 to create my first app.
I would like to know what is best practice to get Current Visual state name in View Model.
In code behind XAML I have been using:
VisualState vs = AdaptiveVisualStateGroup.CurrentState;
if (vs != null)
{
string actualStateName = vs.Name
}
What is best way to get same thing in ViewModel?
Please don't try to mess around with the visual state in your view-model. Consider this, your view-model exists to handle the underlying data necessary for your view. This is NOT the same thing as presenting the data in your view. Your view, on the other hand, has the logic to present data - and to do it with different visual states based on certain triggers. Those triggers are visual triggers, not data triggers. For that reason, you should handle visual states in the view and the implicit code-behind of the view.
If the data impacts the view, like if the user logs out suddenly or something, then that, too, is a property (like IsLoggedIn) in your view-model that your view uses to change the visual state. If you are trying to get a reference to the visual state in your view-model then you are sort of short circuiting the intent of MVVM.
That being said, I am not the developer of your app, you are. And, the code you are showing is the only way to reliably get the current visual state. It is worth pointing out that more than one visual state can be active at one time across multiple visual state groups. How could you possibly run the code you provided without a direct reference of the visual state group class in your view-mode? How to get it there?
Page.OnNavigatedTo() { ViewModel.Group = AdaptiveVisualStateGroup; } is how.
But I hope you consider the rest of the answer.

"Failed to query property values" error on component in REDHAWK

My waveform initializes well on startup, but after a few seconds into processing, it pops up a red flag on the symbol on the right in the IDE's SCA Explorer tab. The tool tip says "Failed to query property values".
I believe the issue is caused by the "process" method in the component taking too long, but I need to be able to obtain a certain element of a rather long list of chunks of data, so I can process each chunk. Therefore, I need to have a property of the component be a reference to this long list of data. Is there a better way of doing this? I had created a child process to do all of this, but that sort of defeats the purpose of using REDHAWK to manage the execution.
Thanks for your time!
Ben,
The first step will be to understand exactly what error occurred. This can be done by following the steps listed here. Basically:
Window > Show View > Other ...
Select General > Properties. The properties view should now be visible
In the SCA Explorer view, select the application with the red flag symbol
Now in the Properties view, you should see two tabs "Properties", and "Advanced". In the "Advanced" tab where will be a Status field that says "Failed to query property values...". When you select this field it will show a "Details..." button. Click that to receive the stack trace for the error.
Another alternative is to use the Python Sandbox (or unittest) capabilities to start your component and attempt a query. The equivalent error will be thrown as a Python exception. You can learn about the sandbox here.
As for the second part of your question, the REDHAWK process() method is already executing as a sub-thread, so it won't block query() operations unless you have created a thread lock (or used the propertySetAccess lock within your serviceFunction). If you are using a lock, then it is possible that the query() will block until the CORBA timeout is reached. You will know if this has occurred because the stack trace will be a CORBA Timeout error.
However, you said "I need to have a property of the component be a reference to this long list of data" so I think you may be getting an error related to the maximum CORBA transfer size. You can adjust the CORBA maximum transfer size by editing /etc/omniORB.cfg so the problem goes away, but your component will cause problems for others who use it. A better option is to reconsider the design of the component. You will probably want to use BULKIO ports to transfer the data in-to and out-of your component.
If you could provide more details about the algorithm you are using or source code examples, that could provide additional information that would help isolate the root problem.

How to add a property an ASP.Net user control or web page and have that property read by Microsoft coded-ui testing? (CUIT)

I am using Microsoft coded-ui testing (CUIT) in VS 2010 Ultimate to test an ASP.Net 4.0 site.
I have the source code to the ASP.Net site, so I can modify it as needed.
I've got record/playback working.
I can write simple assert statements in the test methods to check properties of the UITestControl descendents (HTML links, tables, etc.) and compare them to expected values.
I want to add properties to user controls (ASCX's) and pages in my site, to pass back useful values to the testing code.
For example, I have a user control that implements a menu which displays different sets of menu items depending on the role of the current user.
Rather than having the test script click at the various menu items to check whether or not they're present, I want to add a property to the user control. This property will return info to the caller, listing the menus and menu items present.
I've found info on the Net on how to do this in WinForms, but this code relies on accessability, which I believe is only useful for CUIT with WinForms. Likewise, I've found info on how to do it with WPF/SL.
The answer may be related to getting the UITestControl.NativeElement property, then calling a method that overrides GetProperty(), but I haven't been able to get this approach to work.
Can anyone provide a short code sample showing how to add a property to an ASCX or ASPX page, where that property can be written in C# code-behind, and read by Microsoft Coded UI Testing (CUIT) code?
Thanks!
Adam Leffert
http://www.leffert.com
I haven't found an answer to this question, but I have written some code to solve the underlying problem.
I realized that adding properties to user controls would keep the validation data together with the control under test, but only for the case where the section of UI was implemented as a user control.
There are at least two other cases I need to cover:
1) Third-party controls added to the page, for example ASPxGridView, ASPxTreeView, etc.
2) Items that are not visible in the UI, for example the user profile data for the current user.
When you're running CUIT validation code with a Web app, the data you have available is DOM data, i.e. a tree that represents the contents of the Document Object Model of the contents of the browser window. There is no Request object, .Net Page object, etc. This DOM data is accessible through the UIMap object.
I don't want to wrap the third-party controls in user controls, because doing so would disturb the application under test, causing me to re-write the application code that touches properties and events of the grid, tree view, etc. Too intrusive for testing code.
So I created a code interface (ITestable) that contains a dictionary of string values, and a list of ITestable children.
In the LoadComplete event handler of the master page, I create an ITestable for the master page and fill the list with child ITestable objects for the child page, which can themselves contain lists of children.
I serialize this object into JSON, then store it in a hidden field on the master page.
I added the hidden field to the UIMap.
The test validation code deserializes the ITestable, then looks through it for values that need validation.
The controls create their own ITestable objects, so they can easily fill the objects with values that may be needed for validation, rather than forcing the test code to manipulate the UI trying to read validation values.
For example, a tree view could return its contents without the testing code having to click on each node and try to read the value displayed there. Additional properties (visible, enabled, etc.) can be stored in the values dictionary for each ITestable object.
CUIT has some very powerful features. I would very much appreciate it if Microsoft would document some best practices for solving these non-trivial validation problems. I've read through the Microsoft documentation but haven't found much on this topic for Web apps.

does NSManagedObjectContextDidSaveNotification get called for transient property updates?

I can't seem to get a clear answer for this: when you change a transient property, and then call save, should the NSManagedObjectContextDidSaveNotification be triggered? In my notification listener, how can I filter out these notifications that are coming from changes in transient properties?
Here's what I'm trying to do: I want to load up a list of contacts in the main thread, and when it's done, I want to read the images in a background thread from the address book and attach them to the contacts. This works fine on the face of it: after loading from the Contacts entity, I use a dispatch queue to loop through all the contacts, find their image in the Address Book, and save them in Contact's "contactImage" property (which is transient). The dispatch queue then successfully reloads the tableview (on the main thread) and the images show up next to the contacts.
The problem is that if I do anything to the contact that invokes a "save" on even ONE of the managed objects (for e.g. I delete one of the contacts), the NSManagedObjectContextDidSaveNotification is invoked for ALL the contacts. I've found that this is because the contactImage property was changed before ... commenting that the "self.contactImage = img;" line makes the issue go away. This is surprising to me, since I would have thought that the save notification would only be called for non-transient properties.
Can anyone confirm if this is expected behavior? Or am I doing something wrong? If it's expected, how do you filter out the updates to transient properties in the NSManagedObjectContextDidSaveNotification listener? I need to do some post-processing in the listener, and I don' want to do it needlessly for transient property updates. I've checked the changedValues dictionary on the NSManagedObject, but it seems to show empty inside the listener (since only transient properties changed, I'm guessing).
Thanks.
Yesterday,
Transient properties have one key characteristic -- they are managed. You can easily add ivars that are not managed to any NSManagedObject. If you do so, they are not subject to -save: notifications.
A related question: Why are you using a transient ivar? They have some specialized uses; primarily, they are used to trigger property updates throughout the model; i.e. the behavior you are seeing.
A second related question: why are you background fetching all of the images instead of lazy loading them from the Address Book? This looks like a case of premature optimization to me.
Andrew

Resources