Of course the first thing on my mind after returning from a nice long summer vacation is continuing the RadControls for Windows Phone 7 MVVM series of blog posts and adding more examples to our working project of how you can quickly and easily start using our WP7 controls with the MVVM pattern. While I’m working on something pretty cool for later in the week (hint: it may involve something like this), I wanted to show you how you can pretty quickly get both RadDatePicker and RadTimePicker working with MVVM.
(( Heads up! I’ve upgraded this project to utilize the Q2 2011 Beta version of the RadControls for Windows Phone, so be sure you’re using that too if you download the sample and test it out! ))
Step 1 – A Quick ViewModel
Since we have two controls that are pretty straightforward, we don’t need to take advantage of any RelayCommands or anything more complex from the MVVM pattern or the MVVM Light framework. RadDatePicker and RadTimePicker will both allow us to bind to a DateTime value that sends change notifications back (as well as allowing for constraints, preventing people from selecting really off-base or out-of-range DateTime values) to work with the binding system we all know and love in Silverlight.
This means our ViewModel is a lot of the same that you are used to from either just knowing the MVVM pattern or following this series:
public
class
RadDateTimeViewModel : ViewModelBase
{
private
DateTime _selectedTime;
public
DateTime SelectedTime
{
get
{
return
_selectedTime; }
set
{
if
(value != _selectedTime)
{
_selectedTime = value;
RaisePropertyChanged(
"SelectedTime"
);
}
}
}
private
DateTime _selectedDate;
public
DateTime SelectedDate
{
get
{
return
_selectedDate; }
set
{
if
(value != _selectedDate)
{
_selectedDate = value;
RaisePropertyChanged(
"SelectedDate"
);
}
}
}
public
RadDateTimeViewModel()
{
SelectedDate =
new
DateTime(2011, 6, 15);
SelectedTime =
new
DateTime(2011, 6, 15, 11, 30, 00);
}
}
Makes sense, right? So now we can move onto our Xaml…
Step 2 – Writing Up Some Xaml
Like I mentioned earlier, these controls make it quite easy and are pretty straightforward in their implementations, so there is not anything terribly complex about using them within your application, even when utilizing the MVVM pattern. Be sure to thank the Telerik WP7 development team for this, as they are the masterminds behind making this such a rich and high performance suite for the platform, all the while adhering to Metro principles of design to make sure our controls will fit effortlessly into any application you are making!
Back on track, our Xaml also doesn’t require much explaining. We’re setting the Value property on both controls to perform TwoWay binding to their respective values on the ViewModel and doing the usual resource/datacontext setup, so here is what the final markup looks like:
<
Grid
x:Name
=
"ContentPanel"
Grid.Row
=
"1"
Margin
=
"12,0,12,0"
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"75"
/>
<
RowDefinition
Height
=
"Auto"
/>
<
RowDefinition
/>
<
RowDefinition
Height
=
"75"
/>
<
RowDefinition
Height
=
"Auto"
/>
<
RowDefinition
/>
</
Grid.RowDefinitions
>
<
TextBlock
Text
=
"Select a date to see it reflected below, MVVM style!"
/>
<
telerikInput:RadDatePicker
x:Name
=
"xRadDatePicker"
Value
=
"{Binding SelectedDate, Mode=TwoWay}"
Grid.Row
=
"1"
/>
<
StackPanel
Style
=
"{StaticResource xMidStackPanel}"
Grid.Row
=
"2"
>
<
TextBlock
Text
=
"Selected Date: "
/>
<
TextBlock
Text
=
"{Binding SelectedDate}"
/>
</
StackPanel
>
<
TextBlock
Text
=
"Select a time to see if below, via MVVM and the magic of binding!"
TextWrapping
=
"Wrap"
Grid.Row
=
"3"
/>
<
telerikInput:RadTimePicker
x:Name
=
"xRadTimePicker"
Value
=
"{Binding SelectedTime, Mode=TwoWay}"
Grid.Row
=
"4"
/>
<
StackPanel
Style
=
"{StaticResource xMidStackPanel}"
Grid.Row
=
"5"
>
<
TextBlock
Text
=
"Selected Time: "
/>
<
TextBlock
Text
=
"{Binding SelectedTime}"
/>
</
StackPanel
>
You’ll be able to see the resource I use for the stackpanels in the code download below, so don’t worry about that not being up above!
Step 3 – Finishing Touches
There are two more things we need to do in order to get this working properly. First up, we want to ensure that both RadDatePicker and RadTimePicker have their application icons set instead of the “images aren’t available” X’s that would display. Our dev team thought of this ahead of time, providing us the images and instructions on how to setup both the default and custom implementations on this help page:
http://www.telerik.com/help/windows-phone/raddatepicker-features-application-bar-buttons.html
Once that is set, the final step is to go back into our MainPageViewModel and change our MyMVVMItem setup to include our two actual pages now instead of the fake testers:
public
ObservableCollection<MyMVVMItem> LoadData()
{
ObservableCollection<MyMVVMItem> tempCollection =
new
ObservableCollection<MyMVVMItem>();
tempCollection.Add(
new
MyMVVMItem(1,
"RadDataBoundListBox"
,
"/Pages/RadDataBoundListBoxMVVM.xaml"
,
"Primitives"
));
tempCollection.Add(
new
MyMVVMItem(2,
"RadDate/TimePicker"
,
"/Pages/RadDatePickerMVVM.xaml"
,
"Input"
));
return
tempCollection;
}
Don’t worry, while there are only two items there now we’ll soon be filling this out with a number of nice visualizations that play nicely with MVVM. So as you can see, this MVVM stuff may not be so scary after all!
Be sure to download the source code for the current project and stay tuned for some more rich visual goodness later this week!
Evan Hutnick works as a Developer Evangelist for Telerik specializing in Silverlight and WPF in addition to being a Microsoft MVP for Silverlight. After years as a development enthusiast in .Net technologies, he has been able to excel in XAML development helping to provide samples and expertise in these cutting edge technologies. You can find him on Twitter @EvanHutnick.