views:

43

answers:

1

I have a progress bar shown as I am loading images with the webclient object asynchronously. Once the images have been downloaded I set the loadingComplete bool property to True in my viewmodel to indicate that the loading process has been completed. Currently I am using this value for an attached property to set focus on a control.

What I want is to collapse the progress bar control and then show the images.

What I want to know is what is the best way to do this and what are the pros and cons of the following methods?

Should I

1) create a LoadingOpacity bool property on viewmodel which I can then set to set opacity of the progress bar to 0.0 (this would be set when loadingComplete is set)?

2) Or Should I create a Converter (IValueConverter) and use the loadingComplete property to convert this to a Visibility.Collapsed value. This way I do not need any extra properties in my view model?

3) Or should I create a collapsed property on the view model and bind that to the visibility property of the progress bar?

4) or is/are there other ways to do this?

Thanks JD

+7  A: 
  1. I wouldn't go with the opacity solution because of mouse hit testing. Your transparent element would still be hit-test-visible, however you might want to fade the progress bar when the download is complete, but maybe a storyboard triggered by an event is a better option for that.
  2. I personally like value converters, they are simple, terse, descriptive and to the point. This is also widely accepted as the correct choice.
  3. MVVM Best practices dictate that the view model not be aware of the view. By introducing a Visibility type property to your view model, you couple it to the view in some way (albeit minute).
  4. Probably :)
Aviad P.
Yep - option 2 for mine, too :)
IanR
+1 for option 2.
Martinho Fernandes
Thanks guys. With regards to 3, should the view model be more model/business oriented? What I mean here is by reading properties I can work out what they are used for but if I bring in opacity or visibility, it becomes a lot harder to understand and they will be specific to the view I have (if I swap out the view, then they might not be used at all).
JD
In general, the VM should contain properties that more or less mirror ones in your business model. The VM is view-aware, so it might also contain properties that facilitate view operations such as change notifications (the most obvious), properties for representing view state (read-only, edit, add), commanding properties, etc.
Aviad P.
+1 for option 2 but I think you should highlight option 2 as the prefered option. Whilst it my be your personal preference I think you could state it more strongly as being the correct choice in this scenario.
AnthonyWJones