It seems that PRISM technology will be favorized by implementing Wpf, Silverlight or Windows Phone 7 applications. My personal opinion is that the current development state of PRISM needs too much manual development effort for realizing a project. Some automated goodies would be needed for PRISM hardly. But I think they would be realized and available in conceivable time.
I prefer something between: Implementing M-V-VM with PRISM library. Especially the DelegateCommand of PRISM is a goodie which simplifies Commanding and improves the understanding MVVM and reading of written code lines remarquable.
In the following lines I have coded an MVVM with PRISM example. It is a simple master detail visualization.
Model (CPerson.cs):
using System.ComponentModel; namespace prism.Model { public class CPerson : INotifyPropertyChanged { #region Fields private string _lastName; private string _email; private string _firstName; private string _city; #endregion #region Properties public string LastName { get { return _lastName; } set { if (_lastName != value) { _lastName = value; NotifyPropertyChanged("LastName"); } } } public string Email { get { return _email; } set { if (_email != value) { _email = value; NotifyPropertyChanged("Email"); } } } public string FirstName { get { return _firstName; } set { if (_firstName != value) { _firstName = value; NotifyPropertyChanged("FirstName"); } } } public string City { get { return _city; } set { if (_city != value) { _city = value; NotifyPropertyChanged("City"); } } } #endregion #region Constructor/Destructors public CPerson() { } public CPerson(CPerson person) { if (person != null) { FirstName = person.FirstName; City = person.City; Email = person.Email; LastName = person.LastName; } } #endregion #region Methods public void Copy(CPerson person) { FirstName = person.FirstName; City = person.City; Email = person.Email; LastName = person.LastName; } private void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion } }
ViewModel (MainViewModel.cs):
using System.ComponentModel; namespace prism.Model { public class CPerson : INotifyPropertyChanged { #region Fields private string _lastName; private string _email; private string _firstName; private string _city; #endregion #region Properties public string LastName { get { return _lastName; } set { if (_lastName != value) { _lastName = value; NotifyPropertyChanged("LastName"); } } } public string Email { get { return _email; } set { if (_email != value) { _email = value; NotifyPropertyChanged("Email"); } } } public string FirstName { get { return _firstName; } set { if (_firstName != value) { _firstName = value; NotifyPropertyChanged("FirstName"); } } } public string City { get { return _city; } set { if (_city != value) { _city = value; NotifyPropertyChanged("City"); } } } #endregion #region Constructor/Destructors public CPerson() { } public CPerson(CPerson person) { if (person != null) { FirstName = person.FirstName; City = person.City; Email = person.Email; LastName = person.LastName; } } #endregion #region Methods public void Copy(CPerson person) { FirstName = person.FirstName; City = person.City; Email = person.Email; LastName = person.LastName; } private void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion } }
View (MainWindow.xaml):
<Window x:Class="prism.View.PersonWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:prism.Viewmodel" Title="PersonWindow" Height="561" Width="594"> <Window.DataContext> <vm:MainViewModel/> </Window.DataContext> <Window.Resources> <Style x:Key="LabelStyle" TargetType="{x:Type TextBlock}"> <Setter Property="FontWeight" Value="Bold" /> </Style> <Style x:Key="GridViewHeaderStyle" TargetType="{x:Type GridViewColumnHeader}"> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="Foreground" Value="Maroon" /> <Setter Property="Background" Value="LightSkyBlue" /> </Style> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="25" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <ListView Grid.Row="0" BorderBrush="White" ItemsSource="{Binding Path=PersonList}" HorizontalAlignment="Stretch" SelectedItem="{Binding Path=SelectedPerson}"> <ListView.View> <GridView> <GridViewColumn Header="Last name" Width="150" HeaderContainerStyle= "{StaticResource GridViewHeaderStyle}" DisplayMemberBinding="{Binding Path=LastName}" /> <GridViewColumn Header="First name" Width="150" HeaderContainerStyle= "{StaticResource GridViewHeaderStyle}" DisplayMemberBinding="{Binding Path=FirstName}" /> <GridViewColumn Header="City" Width="150" HeaderContainerStyle= "{StaticResource GridViewHeaderStyle}" DisplayMemberBinding="{Binding Path=City}" /> </GridView> </ListView.View> </ListView > <Grid Grid.Row="2" HorizontalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="25" /> <RowDefinition Height="25" /> <RowDefinition Height="25" /> <RowDefinition Height="25" /> <RowDefinition Height="25" /> <RowDefinition Height="25" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource LabelStyle}">Last name</TextBlock> <TextBox HorizontalAlignment="Left" Grid.Row="0" Grid.Column="1" Width="350" Margin="10, 0, 5, 0" Text="{Binding DetailViewPerson.LastName, Mode=TwoWay}"></TextBox> <TextBlock Grid.Row="1" Grid.Column="0" Style="{StaticResource LabelStyle}">First name</TextBlock> <TextBox HorizontalAlignment="Left" Grid.Row="1" Grid.Column="1" Width="350" Margin="10, 0, 5, 0" Text="{Binding DetailViewPerson.FirstName, Mode=TwoWay}"></TextBox> <TextBlock Grid.Row="2" Grid.Column="0" Style="{StaticResource LabelStyle}">City</TextBlock> <TextBox HorizontalAlignment="Left" Grid.Row="2" Grid.Column="1" Width="350" Margin="10, 0, 5, 0" Text="{Binding DetailViewPerson.City, Mode=TwoWay}"></TextBox> <TextBlock Grid.Row="3" Grid.Column="0" Style="{StaticResource LabelStyle}">e-Mail</TextBlock> <TextBox HorizontalAlignment="Left" Grid.Row="3" Grid.Column="1" Width="350" Margin="10, 0, 5, 0" Text="{Binding DetailViewPerson.Email, Mode=TwoWay}"></TextBox> <Grid Grid.Row="5" Grid.Column="1" HorizontalAlignment="Center"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Button Grid.Row="1" Width="100" Grid.Column="0" Command="{Binding CommandPersonNew}">New</Button> <Button Grid.Row="1" Width="100" Grid.Column="1" Command="{Binding CommandPersonDiscard}">Discard</Button> <Button Grid.Row="1" Width="100" Grid.Column="2" Command="{Binding CommandPersonDelete}">Delete</Button> <Button Grid.Row="1" Width="100" Grid.Column="3" Command="{Binding CommandPersonSave}">Save</Button> </Grid> </Grid> </Grid> </Window>
And finally here you find the zipped project.