iPhone to WP7 – Diving Deeper

i2WLogo2-Tutorials

Go to First Tutorial

In this tutorial, we’ll expand upon the work done in the previous tutorial and we’ll look more closely at a few key issues.

MVVM

iStock_WindowXSmall As an iPhone Developer your thinking is adapted to and influenced by the Model-View-Controller pattern. The very good news is that the pattern for Windows Phone 7 (WP7) development, MVVM, is very closely related to MVC.


Wikipedia notes that MVVM evolved at Microsoft out of the Model-View-Presenter pattern developed by Martin Fowlerwhich was based, in turn on MVC.  The originators of MVVM often refer to it as a specialization of Model-View-Presenter.   Wikipedia goes on to say,

Largely based on the Model-view-controller pattern (MVC), MVVM is targeted at modern UI development platforms… in which there is a User Experience (UX) developer who has different requirements than a more “traditional” developer (i.e. oriented toward business logic and back end development). The View-Model of MVVM is “basically a value converter on steroids” meaning that the View-Model is responsible for exposing the data objects from the Model in such a way that those objects are easily managed and consumed. In this respect, the View-Model is more Model than View, and handles most if not all of the View’s display logic (though the demarcation between what functions are handled by which layer is a subject of ongoing discussion and exploration).

It is important to understand that MVVM and Silverlight co-evolved, each influencing the other, and thus the “hand in glove” fit between them is no coincidence.

In MVVM both the View and the Model are identical in meaning to what they mean in MVC

The ViewModel is the Model of the View, that is, it is an abstraction of the view and, most important, (just about) all the user-generated view code is kept in the view model (rather than in the code-behind for the View as can also be done in WP7 programming).  Numerous writers have commented that the VM is really a specialized controller that acts as a data binder and converter; changing Model information in to View information, and passing commands from the View that may affect the Model.

Three Core Concepts

We’ve been talking about n-tier development, decoupling, scoping, visibility and related topics since at least 1990. I’m pretty sure that when they were cracking the Enigma machine in World War II, they discussed decoupling the code-breaker module from the UI (did they have UI then?)

MVVM, at its heart has three core concepts:

MVVMSketch

Core Concept #1Separate your User Interface concerns (View) from your Business objects and behaviors (View Model) and from your data/persistence layer (Model).

Core Concept #2: Don’t Look Up.

We tend to conceptualize the View at the top, the ViewModel  in the middle and the model  at the bottom.  The View can know about the ViewModel, the ViewModel about the Model, and the Model, like the cheese, stands alone.

Core Concept #3 – And this is the killer: Binding.

In MVVM the mechanism for the ViewModel to provide data to the View, is for the View to set the ViewModel as its DataContext.  That is so cool; it takes a while to realize the implications.  Further, we don’t just bind data, as I’ll show below.

[ click on any image to see it full size ]

Why Would You Want To Do That, & What Does It Cost?

The huge advantages of MVVM (and MVC) are that

  • you write less code
  • you have enormously increased the testability of your application.

It is a bear to try to test a UI object because the pesky UI gets in the way. ViewModels have no UI, they have just the things you want to test: “does it behave as expected? and is the data correct at any given instant?”

So, the cost is negative; that is, by adopting MVVM you don’t work harder, you work less, and in exchange for doing less, your code is easier to write, to read, to maintain and to test. Not bad.

Concrete Guidelines

Because MVVM is somewhat new, and because I’m totally disinterested in pilpul I will arbitrarily suggest the following guidelines:

  1. Do not bother with MVVM for any program that takes less than 1 hour to write.
  2. Move as much logic as possible from the view to the VM, but try not to become obsessed
  3. Use a MVVM library (life is short!)   We’ll use the (free) MVVM Light Toolkit in this series.
  4. Chillax

Creating An MVVM Application

Let’s return to the application started in the previous tutorial, and add two-way binding so that we can update the records. That will give us an opportunity to examine, in a bit more detail, the responsibilities of the Model, ViewModel and View, and will allow us also to talk a bit more about event handling.

Because we are early in the tutorials, there is value in starting from scratch.  Create a new project of type MVVMLight (WP7) [If you don’t see this option you do not have the  MVVM Light Toolkit installed.].  Call your new application i2w_CustomerData

Here, for your cut and past convenience, is the Xaml from the example in the previous tutorial, except that I’ve removed the bottom two rows (Notes and Male/Female) and added a button (Next)

<Grid.RowDefinitions>
   <RowDefinition Height="1*" />
   <RowDefinition Height="1*" />
   <RowDefinition Height="1*" />
   <RowDefinition Height="1*" />
   <RowDefinition Height="1*" />
   <RowDefinition Height="1*" />
   <RowDefinition Height="1*" />
   <RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
   <ColumnDefinition Width="1*" />
   <ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.ColumnSpan="1"
           Grid.RowSpan="1"
           Height="30"
           HorizontalAlignment="Right"
           Margin="5"
           Name="NamePrompt"
           Text="Full Name"
           VerticalAlignment="Center" />
<TextBlock Height="30"
           HorizontalAlignment="Right"
           Margin="5"
           Name="AddressPrompt"
           Text="Street Address"
           VerticalAlignment="Center"
           Grid.Row="1" />
<TextBlock Height="30"
           HorizontalAlignment="Right"
           Margin="5"
           Name="CityStateZipPrompt"
           Text="City, State, Zip"
           VerticalAlignment="Center"
           Grid.Row="2" />
<TextBlock Height="30"
           HorizontalAlignment="Right"
           Margin="5"
           Name="PhonePrompt"
           Text="Phone"
           VerticalAlignment="Center"
           FontWeight="Bold"
           Grid.Row="3" />
<TextBlock FontWeight="Bold"
           Height="30"
           HorizontalAlignment="Right"
           Name="FaxPrompt"
           Text="Fax"
           VerticalAlignment="Center"
           Margin="5"
           Grid.Row="4" />
<TextBlock FontWeight="Bold"
           Height="30"
           HorizontalAlignment="Right"
           Name="EmailPrompt"
           Text="Email"
           VerticalAlignment="Center"
           Margin="5"
           Grid.Row="5" />
<TextBlock FontWeight="Bold"
           Height="30"
           HorizontalAlignment="Right"
           Name="NotesPrompt"
           Text="Notes"
           VerticalAlignment="Center"
           Margin="5"
           Grid.Row="7" />
<TextBox Grid.Column="1"
         Height="70"
         HorizontalAlignment="Left"
         Margin="5,0,0,5"
         Name="FullName"
         VerticalAlignment="Bottom"
         Width="303"
         Text="{Binding Name}" />
<TextBox Height="70"
         HorizontalAlignment="Left"
         Margin="5,0,0,5"
         Name="Address"
         VerticalAlignment="Bottom"
         Width="303"
         Grid.Column="1"
         Grid.Row="1"
         Text="{Binding Address}" />
<StackPanel Grid.Column="1"
            Grid.Row="2"
            Grid.RowSpan="1"
            HorizontalAlignment="Stretch"
            Name="cityStateZipStack"
            VerticalAlignment="Stretch"
            Orientation="Horizontal">
   <TextBox Height="70"
            Name="City"
            Width="150"
            HorizontalAlignment="Left"
            VerticalAlignment="Bottom"
            Margin="5,0,0,5"
            Text="{Binding City}" />
   <TextBox Height="70"
            Name="State"
            Width="74"
            HorizontalAlignment="Left"
            VerticalAlignment="Bottom"
            Margin="0,0,0,5"
            Text="{Binding State}"
 />
   <TextBox Height="70"
            Name="Zip"
            Width="93"
            Margin="0,0,0,5"
            Text="{Binding Zip}" />
</StackPanel>
<TextBox Height="70"
         HorizontalAlignment="Left"
         Margin="5,0,0,5"
         Name="Phone"
         VerticalAlignment="Bottom"
         Width="303"
         Grid.Column="1"
         Grid.Row="3"
         Text="{Binding WorkPhone}" />
<TextBox Height="70"
         HorizontalAlignment="Left"
         Margin="5,0,0,5"
         Name="Fax"
         VerticalAlignment="Bottom"
         Width="303"
         Grid.Column="1"
         Grid.Row="4"
         Text="{Binding Fax}" />
<TextBox Height="70"
         HorizontalAlignment="Left"
         Margin="5,0,0,5"
         Name="Email"
         VerticalAlignment="Bottom"
         Width="303"
         Grid.Column="1"
         Grid.Row="5"
         Text="{Binding WorkEmail}" />

<Button
         Name="Next"
         Content="Next"
         Width="150"
         Grid.Column="1"
         Grid.Row="7"
         />

Creating the Model

Once again, we’ll create a Customer.cs class in the model,

 public class Customer
 {

     public string First { get; set; }
     public string Last { get; set; }
     public string Address { get; set; }
     public string City { get; set; }
     public string State { get; set; }
     public string Zip { get; set; }
     public string HomePhone { get; set; }
     public string WorkPhone { get; set; }
     public string Fax { get; set; }
     public string WorkEmail { get; set; }
     public string HomeEmail { get; set; }
     public bool IsMale { get; set; }
     public string Notes { get; set; }
     public int CreditRating { get; set; }
     public DateTime FirstContact { get; set; }
     public DateTime LastContact { get; set; }

     public Customer(
         string first,
         string last,
         string address,
         string city,
         string state,
         string zip,
         string homePhone,
         string workPhone,
         string fax,
         string workEmail,
         string homeEmail,
         bool isMale,
         string notes,
         Int16 creditRating,
         DateTime firstContact,
         DateTime lastContact)
     {
         First = first;
         Last = last;
         Address = address;
         City = city;
         State = state;
         Zip = zip;
         HomePhone = homePhone;
         WorkPhone = workPhone;
         Fax = fax;
         HomeEmail = homeEmail;
         WorkEmail = workEmail;
         IsMale = isMale;
         Notes = notes;
         CreditRating = creditRating;
         FirstContact = firstContact;
         LastContact = lastContact;
     }
}

This time, however, let’s add to the model and create a collection of customers,

public class CustomerCollection
{
    private readonly List< Customer > _customers = new List< Customer >();

    public CustomerCollection()
    {
        GenerateCustomers( 500 );
    }

    public List< Customer > Customers
    {
        get { return _customers; }
    }

    public void GenerateCustomers( int howMany )
    {
        var firsts = new List< String >
                     {
                         "Abe",
                         "Alice",
                         "Barry",
                         "Basha",
                         "Charlie",
                         "Colette",
                         "David",
                         "Davida",
                         "Edgar",
                         "Elizabeth",
                         "Frank",
                         "Fran",
                         "George",
                         "Gary",
                         "Harry",
                         "Isaac",
                         "Jesse",
                         "Jessica",
                         "Kevin",
                         "Katrina",
                         "Larry",
                         "Linda",
                         "Mark",
                         "Melinda",
                         "Nick",
                         "Nancy",
                         "Oscar",
                         "Ophilia",
                         "Peter",
                         "Patricia",
                         "Quince",
                         "Quintina",
                         "Robert",
                         "Roberta",
                         "Shy",
                         "Sarah",
                         "Tom",
                         "Teri",
                         "Uberto",
                         "Uma",
                         "Victor",
                         "Victoria",
                         "Walter",
                         "Wendy",
                         "Xerxes",
                         "Xena",
                         "Yaakov",
                         "Yakira",
                         "Zach",
                         "Zahara"
                     };

        var lasts = new List< String >
                    {
                        "Anderson",
                        "Baker",
                        "Connors",
                        "Davidson",
                        "Edgecumbe",
                        "Franklin",
                        "Gregory",
                        "Hines",
                        "Isaacson",
                        "Johnson",
                        "Kennedy",
                        "Liberty",
                        "Mann",
                        "Nickerson",
                        "O'Dwyer",
                        "Patterson",
                        "Quimby",
                        "Richardson",
                        "Stevenson",
                        "Tino",
                        "Usher",
                        "Van Dam",
                        "Walker",
                        "Xenason",
                        "Yager",
                        "Zachery"
                    };
        var streets = new List< String >
                      {
                          "Ash",
                          "Beech",
                          "Cedar",
                          "Dogwood",
                          "Elm",
                          "Filbert",
                          "Ginkgo",
                          "Hawtorn",
                          "Ironwood",
                          "Juniper",
                          "Katsura",
                          "Lilac",
                          "Magnolia",
                          "Nectarine",
                          "Oak",
                          "Palm",
                          "Quince",
                          "Redwood",
                          "Sassafrass",
                          "Tupelo",
                          "Vibrunum",
                          "Walnut",
                          "Yellowwood",
                          "Zelkova"
                      };
        var cities = new List< String >
                     {
                         "Acton",
                         "Boston",
                         "Canton",
                         "Dell",
                         "Everstone",
                         "Flintwood",
                         "Gary",
                         "Houston",
                         "Imperial",
                         "Jackson",
                         "Kalamazoo",
                         "Levinworth",
                         "Macon",
                         "New York",
                         "Oak Hill",
                         "Paducah",
                         "Quinzy",
                         "Rochester",
                         "South Falls",
                         "Terra Haute",
                         "Union",
                         "Victoria",
                         "Waipio",
                         "Xenia",
                         "York",
                         "Zanesville"
                     };
        var isp = new List< String >
                  {
                      "ATT",
                      "Verizon",
                      "Hotmail",
                      "Gmail",
                      "Sprintnet",
                      "Yahoo"
                  };
        var states = new List< String >
                     {
                         "AL",
                         "AK",
                         "AS",
                         "AR",
                         "CA",
                         "CO",
                         "CT",
                         "DE",
                         "FL",
                         "GA",
                         "HI",
                         "ID",
                         "IL",
                         "IN",
                         "IA",
                         "KS",
                         "KY",
                         "LA",
                         "ME",
                         "MD",
                         "MA",
                         "MI",
                         "MN",
                         "MS",
                         "MO",
                         "MT",
                         "NE",
                         "NV",
                         "NH",
                         "NJ",
                         "NM",
                         "NY",
                         "NC",
                         "ND",
                         "OH",
                         "OK",
                         "PA",
                         "RI",
                         "SC",
                         "SD",
                         "TN",
                         "TX",
                         "UT",
                         "VA",
                         "WA",
                         "WI",
                         "WY"
                     };

        var random = new Random();
        for ( int i = 0; i < howMany; i++ )
        {
            string first = firsts[ random.Next( 0, firsts.Count ) ];
            string last = lasts[ random.Next( 0, lasts.Count ) ];
            int streetNumberInt = random.Next( 101, 999 );
            string streetNumber = streetNumberInt.ToString();
            string zipCode = random.Next( 10000, 99999 ).ToString();
            string homePhone = random.Next( 200, 999 ) + "-555-"
                               + random.Next( 2000, 9099 );
            string workPhone = random.Next( 200, 999 ) + "-555-"
                               + random.Next( 2000, 9099 );
            string fax = random.Next( 200, 999 ) + "-555-"
                         + random.Next( 2000, 9099 );
            string homeEmail = first + "@"
                               + isp[ random.Next( 0, isp.Count ) ]
                               + ".com";
            string workEmail = last + "@"
                               + isp[ random.Next( 0, isp.Count ) ]
                               + ".com";
            bool isMale = ( random.Next( 1, 3 ) ) % 2 == 0
                              ? true
                              : false;
            var creditRating = ( short ) random.Next( 100, 800 );
            var firstContact = new DateTime( 2010, 1, 1 );
            DateTime lastContact = DateTime.Now;

            _customers.Add(
                           new Customer(
                               first,
                               last,
                               streetNumber + " "
                               +
                               streets[
                                       random.Next(
                                                   0, streets.Count - 1 )
                                   ]
                               + " Street",
                               cities[
                                      random.Next( 0, cities.Count - 1 )
                                   ],
                               states[
                                      random.Next( 0, states.Count - 1 )
                                   ],
                               zipCode,
                               workPhone,
                               homePhone,
                               fax,
                               homeEmail,
                               workEmail,
                               isMale,
                               "No notes at this time",
                               creditRating,
                               firstContact,
                               lastContact ) );
        }
    }
}

The constructor of this class generates 500 random records and places them in a List<Customer>. the class consists of a public property, Customers, that returns the collection, and otherwise nothing but the method, GenerateCustomers, which mixes and matches names, cities, etc. to create records.

Data

It is tempting to create a search function and an update, but that complexity can wait for a later tutorial. Let’s keep things simple and just display the records one after the other.

The work of controlling the View is done in the ViewModel which will implement the INotifyPropertyChanged Interface.

Interfaces

An Interface is a contract that a class implements.  The Interface itself is declared with members, much like a class, but the members are not implemented. The Interface dictates what an implementing class will provide, and clients of the implementing class can count on those elements being present.  In this example, the binding mechanism depends on the VM

How You implement An Interface

You fulfill the contract by implementing all the methods and events of the Interface. That is, if the interface looks like this:

interface Writeable
{
   void Read();
   void Write();
}

(and notice that the interface does not have to begin with a capital I, though just about every interface from Microsoft does: INotifyProopertyChanged, IEnumerable, IClaudius…)

There is no implementation in the interface itself (nor does it have a return value or a public/private designation).  If your class states that it imlements this interface3, it must supply a body for both methods,

class foo : Writeable
{
   public void Think()
   {
      System.DialogBox.Show("I Think Therefore I Might Be");
    }

   public void Read()
   {
         System.DialogBox.Show("So Many Books, So Little Time.");
   }

   public void Write()
    {
       System.DialogBox.Show("To err is human, to write, divine.");
     }
}

The implementing class is of course free to add additional methods and events.

For more on delegates please see the C# documentation or my books Programming C# and Learning C#.

In this case, the INotifyPropertyChanged interface has only one member, the event PropertyChanged.  While it is up to you how you implement this event, you must follow its declaration, passing in an object and an instance of PropertyChangedEventArgs. The PropertyChangedEventArgs class has one member that you must provide: the name of the property that has changed. In our case, we want to say that every property has changed rather than sort through which properties are different in the new record vs. the old.

How You Declare the Interface

Add the interface you wish to declare you implement after declaring the class from which you derive:

public class MainViewModel : ViewModelBase, INotifyPropertyChanged

Implementing the View Model

The ViewModel in this case derives from ViewModelBase supplied by the MVVM Light Toolkit, which also implements INotifyPropertyChanged, so the declaration shown above is legal but redundant.

The base class follows the common idiom and implements a method RaisePropertyChanged that takes a property name and passes it along to the event (after doing some housekeeping that need not concern us now).

// MainViewModel.cs
public void Next()
 {
     _currentCustomer = _customerCollection.Customers[++_currentOffset];
     base.RaisePropertyChanged("Name");

When the event is called, the named property updates, using the data context in the view code behind,

// MainPage.xaml.cs
void MainPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
 {
     vm = new MainViewModel();
     DataContext = vm;

In our case, the data context is the ViewModel itself.  That works because the VM has properties for each of the controls on the page,

//MainViewModel.cs
 public string Address { get { return _currentCustomer.Address; } }
 public string City { get { return _currentCustomer.City;  } }
 public string State { get { return _currentCustomer.State; } }
 public string Zip { get { return _currentCustomer.Zip; } }
 public string WorkPhone { get { return _currentCustomer.WorkPhone; } }
 public string Fax { get { return _currentCustomer.Fax; } }
 public string WorkEmail { get { return _currentCustomer.WorkEmail; } }
 public string Name { get { return _currentCustomer.First + " " + _currentCustomer.Last; } }

Notice that this time we’re wrapping all the properties rather than using a pass through to the customer collection.

Here is the complete code for the ViewModel,

using GalaSoft.MvvmLight;
using i2W_CustomerData.Model;

namespace i2W_CustomerData.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        private int _currentOffset = -1;
        private readonly CustomerCollection _customerCollection = new CustomerCollection();

        public string Address { get { return _currentCustomer.Address; } }
        public string City { get { return _currentCustomer.City; } }
        public string State { get { return _currentCustomer.State; } }
        public string Zip { get { return _currentCustomer.Zip; } }
        public string WorkPhone { get { return _currentCustomer.WorkPhone; } }
        public string Fax { get { return _currentCustomer.Fax; } }
        public string WorkEmail { get { return _currentCustomer.WorkEmail; } }
        public string Name { get { return _currentCustomer.First + " " + _currentCustomer.Last; } }

        private Customer _currentCustomer;
        public Customer CurrentCustomer
        {
            get { return _currentCustomer; }
        }

        public string ApplicationTitle { get { return "iPhone To WP7"; } }

        public string PageName { get { return "Customer"; } }

        public MainViewModel()
        {
            _currentCustomer = new Customer();
            Next();
        }

        public void Next()
        {
            _currentCustomer = _customerCollection.Customers[++_currentOffset];
            base.RaisePropertyChanged("Name");
            base.RaisePropertyChanged("Address");
            base.RaisePropertyChanged("City");
            base.RaisePropertyChanged("State");
            base.RaisePropertyChanged("Zip");
            base.RaisePropertyChanged("WorkPhone");
            base.RaisePropertyChanged("Fax");
            base.RaisePropertyChanged("WorkEmail");
        }
    }
}

And, finally, here is the complete source for the code behind for the MainPage.xaml

using i2W_CustomerData.ViewModel;

namespace i2W_CustomerData
{
    public partial class MainPage
    {
        private MainViewModel vm;

        public MainPage()
        {
            InitializeComponent();
            Loaded += MainPage_Loaded;
        }

        void MainPage_Loaded(
             object sender, System.Windows.RoutedEventArgs e)
        {
            vm = new MainViewModel();
            DataContext = vm;
            Next.Click += NextClick;
        }

        void NextClick(
           object sender, System.Windows.RoutedEventArgs e)
        {
            vm.Next();
        }
    }
}

Before we wrap this up, let’s focus in on the keyword event.  As an iPhone programmer, there is an intuitive, almost visceral sense of what an event is, but the keyword has a very specific meaning in C#.  To understand that, we have to back up and look at delegates.

Event Handling and Delegates

Obama When a head of state dies, the president of the United States typically doesn’t have time to attend the funeral personally. Instead, he dispatches a delegate. Often this delegate is the vice president, but sometimes the VP is unavailable and the president must send someone else, such as the secretary of state or even the “first lady.” He doesn’t want to “hardwire” his delegated authority to a single person; he might delegate this responsibility to anyone who is able to execute the correct funeral-protocol. The president defines in advance what responsibility will be delegated (attend the funeral), what parameters will be passed (condolences, kind words, warnings to potential usurpers), and what value he hopes to get back (good will, oil). He then assigns a particular person to that delegated responsibility at “runtime” as the course of his presidency progresses.

Some of the material in this article was stolen borrowed adapted from Programming C# 5th Edition.

[Note, I’m a big fan of our president, this picture is offered with affection. It is a small, articulated action figure given to me for my last birthday, taken in front of an intentionally soft image of the capital ]

I Made The Button, You Handle What Happens When It Is Clicked

The programmer who creates a control such as a button often will not be the programmer who puts that button into an application.  The control writer defines what events the control will support (click, selection changed, etc.) and the control user defines what happens for the events the control user is interested in responding to. Note that the control user need not react to every event, but on the other hand, adding a button that doesn’t react to being pressed is frowned upon. The way the control user indicates what is to happen is to write a method that will handle the event, and then tell the event which method to call when that event is “fired.”  It does that with delegates.

In C#, as in Cocoa Touch, delegates have the responsibility for taking action on behalf of other objects.  In C# however, delegates are created within a class, and that class is not the delegate.

Delegates

Technically, a delegate is a reference type used to encapsulate a method with a specific signature and return type (and even more technically, the return type is not part of the signature of a method).

You can encapsulate any matching method in that delegate.

An event is just a delegate that has been constrained in a few useful ways. For example, while a delegate can be used to invoke a method anywhere, events can only be invoked by the object that declares them (that is to say, if the button has a click event, only the button can raise that click event.)

Previous Tutorial Next Tutorial
Unknown's avatar

About Jesse Liberty

** Note ** Jesse is currently looking for a new position. You can learn more about him at https://jesseliberty.bio Thank you. Jesse Liberty has three decades of experience writing and delivering software projects and is the author of 2 dozen books and a couple dozen online courses. His latest book, Building APIs with .NET, is now available wherever you buy your books. Liberty was a Team Lead and Senior Software Engineer for various corporations, a Senior Technical Evangelist for Microsoft, a Distinguished Software Engineer for AT&T, a VP for Information Services for Citibank and a Software Architect for PBS. He is a 13 year Microsoft MVP.
This entry was posted in Essentials, iPhoneToWP7, Mini-Tutorial, WindowsPhone and tagged , , , , , . Bookmark the permalink.

120 Responses to iPhone to WP7 – Diving Deeper

  1. It is seen to cause dysentery within the bees
    which contributes to death of entire colonies particularly in places
    the place that the temperatures are somewhat cold.

    In case of sore throat that always accompanies a chilly or cough, honey is a great lubricant to the throat.

    Distinguished veterinary surgeon David Urch informs us that it could also be beneficial in cases of
    bronchitis, rhinitis and sinusitis (head shakers).

  2. I desired to take the time to specific my passion closer and this blog that was awesome!

    Caring it!

  3. Just useful information is provided by this blog and that I am subscribing to it-this instant!
    Thanks folks!

  4. Danilo's avatar Danilo says:

    Wow! This web site really presses with me and that I may say nothing significantly less than I really like
    it!

  5. I love utilizing beardilizer products to develop my beard as it
    is in trend trend proper now.

  6. You just do not have them. Hilaire line In addition, there are probably scammers mixed in with a used cars.

    28, low rent homes in houston 2011 and for others, his or heir’s first issue is impossible to repair these issues, such as leather.
    This process of low rent homes in houston getting information. In the final decision. New Century 3 Chevrolet since a long time low rent homes in houston from its purchase.

  7. Nice post. I learn something totally new and challenging on websites I stumbleupon every day.
    It will always be useful to read through articles from
    other authors and practice a little something from other web sites.

  8. I just couldn’t depart your site prior to suggesting that I really enjoyed the usual info a person supply to your visitors?
    Is going to be again steadily in order to check out new posts

  9. hezhong56's avatar hezhong56 says:

    What’s up everyone, it’s my first pay a quick visit at this web site, and post is really fruitful in favor of me, keep up postingthese types of articles.

  10. Fine way of explaining, and nice post to get information on the
    topic of my presentation subject, which i am going to present in university.

  11. The Telepod characters will be sold at any store that sells toys and will be available by
    game launch on September 19. However, in order to Play Angry Birds
    Online; the smart phone is to be held sideways which makes the movement
    and the maneuver much simpler since the phone functions as a joystick
    in a game. And not just any apps – amazing apps that remind you every day why you purchased
    an i – Pad in the first place.

  12. m88's avatar m88 says:

    Free Agents are the opposite approach to get new gamers.

    You’ll see a listing of four or 5 gamers which might be all going to be
    slight upgrades to moderate upgrades on your crew. If you’re actually hurting at a selected position, then free brokers generally is a quick repair.

  13. It’s hard to come by educated people on this subject, however,
    you seem like you know what you’re talking
    about! Thanks

  14. What’s up to every one, the contents existing
    at this web site are genuinely amazing for people experience,
    well, keep up the nice work fellows.

  15. www.orb6.com's avatar www.orb6.com says:

    I loved as much as you will receive carried out
    ight here. The sketch is attractive, your authored
    material stylish. nonetheless, yoou command get got an nervousness over tha yoou wish
    bee delivering the following. unwell unquestionably come more formerly again as exactly the szme nearly a lot often inside case youu sjield this
    hike.

  16. What’s up mates, how is everything, and what
    you want to say concerning this piece of writing, in my view its genuinely remarkable in support of me.

  17. Unquestionably imagine that that you stated. Yourr favourite
    justification seemed to be on the web the easiest faxtor to bear in mind of.

    I say to you, I certainly get annoyed at the same time as folks think about issues that they plainly don’t recognise about.
    You managed to hit the nail upon the top and also outlined out the whole thing
    without having side effect , people could take a signal.
    Will likely bee again to get more. Thank you

  18. I found your site to be quite darn insightful, thanks a lot for posting this information. I was surprised to see a few of the
    answers however, I might have believed that everyone would
    have usually agreed together with the principal behind your post.

  19. As a professional working in information technology I found your site
    to be quite darn informative, thanks a lot for posting this information. I was surprised
    to see a few of the responses nonetheless, I would have believed that everyone would have usually agreed with the principal behind your post.

  20. Reyes's avatar Reyes says:

    Hi there mates, good piece of wrriting and fstidious arguments commented aat this place,
    I am genuinely enjoying by these.

  21. m88 asia's avatar m88 asia says:

    Thanks for your marvelous posting! Ireally enjoyed reading it,
    you will be a great author.I will always bookmark your blog and will eventually
    come back sometime soon. I want to encourage you continue your
    great work, have a nic evening!

  22. Right here is the right website for anybody who really wants to find out about this topic.
    You realize a whole lot its almost tough to argue with you (not that
    I actually would want to…HaHa). You definitely put a brand new spin on a topic which has been discussed
    for a long time. Excellent stuff, just great!

  23. Hi, after reading this awesome paragraph i am too
    delighted to share my familiarity here with colleagues.

  24. Super money saving tips to hold your gas mileage excessive.
    Easy and low cost methods to enhance your vehicles gas
    utilization. No devices, simply wise recommendation to keep your fuel price low!

  25. Great article! We are linking to tis great article on our site.
    Keep up the great writing.

  26. Darby's avatar Darby says:

    You can certainly see your enthusiasm in the work you
    write. The world hopes for more passionate writers
    such as you who are not afraid to mention how they believe.
    All the time go after your heart.stilcoachingjuiceplus.com [Darby]

  27. Merrill's avatar Merrill says:

    great put up, very informative. I ponder why the opposite specialists of this sector
    don’t realize this. You must continue your writing. I am
    sure, you’ve a great readers’ base already!hraz.org; Merrill,

  28. Somee funmds put massive percentages of their assets into financial providers while
    others put their cash into business materials and physical actual estate belongings.

  29. I don’t know whether it’s just me or if everybody else encountering
    problems with your website. It appears like some of the text within your content are running off the screen. Can somebody else
    please provide feedback and let me know if this is happening to them too?

    This might be a problem with my browser because I’ve had this happen previously.
    Appreciate it

  30. After exploring a handful of the blog posts on your website,
    I really like your way of blogging. I saved as a favorite it
    to my bookmark site list and will be checking back in the near future.

    Please check out my website as well and tell me your
    opinion.

  31. Www.Box.com's avatar Www.Box.com says:

    Nice blog right here! Additionally your site so much up very
    fast! What web host are you using? Can I am getting
    your associate hyperlink in your host? I desire my web site loaded up as fast as yours
    lol

  32. Normally I don’t learn article on blogs, however I wish to say that this write-up very forced me
    to try and do so! Your writing style has been surprised me.
    Thanks, quite great post.

  33. It’s nearly impossible to find well-informed people about this subject,
    however, you seem like you know what you’re talking about!
    Thanks

  34. Toucdown pages are the place visitors arrive once they click on a search outcome or online commerciall and
    will comprise content material related to the searcher’s query or ad
    text.

  35. Franziska's avatar Franziska says:

    Overall, Rogue Planet is a superb turn-based
    strategy game as addictive and engaging as any Advance Wars
    title. Krav Maga, a potent fighting and self defense system, is based on a flow that emphasize the natural movements of the human body.

    For more information about Children in Between Program please visit at.

  36. m88's avatar m88 says:

    Hi my family member! I wish to say that this article is amazing, nice written aand include approximately alll significant infos.

    I would like to look extra posts like tgis .

  37. Thank you a bunch for sharing this with all
    folks you really understand what you are talking about!
    Bookmarked. Kindly also seek advice from my site
    =). We could have a link change agreement among us

  38. kik pc's avatar kik pc says:

    However, much like the days of AIM, this can easily be utilized by predators to seek out children, send
    images, and more. As a Black – Berry user, it’s difficult to switch to Android, especially if you’re accustomed to the Black – Berry Messenger app;
    but not to worry, there are many other messenger
    options to download to your new Android device. Several cases have been in the news in which
    people have met through the app.

  39. Despite this fact, there has not been an observed increase in mass shootings perpetrated by
    women. Use steady machine gun fire to kill the targets and then strafe to the left to help Weaver’s squad move forward and enter the ship.
    It can be formulated minimally through studying informational
    posts but maximally by way of expertise.

  40. Asking questions are in fact good thing if you are not understanding
    anything entirely, but this post provides good
    understanding even.

  41. 1 hours per week playing online games compared to just 6.
    In 1980, Alfredo Yao started concocting fruit juices in his own kitchen and launched the Zest-O
    orange drinks in the same year. It’s the archetype of men-women way of relating that works
    the best since the beginning of time.

  42. vps provider's avatar vps provider says:

    The packaging companies will give the management panel
    the power to access and import a group of mofules from the Web.

  43. Wow, that’s what I was exploring for, what a stuff!
    present here at this blog, thanks admin of this site.

  44. Before buying a 2017 ford f150, discover the financing options.

    You want to do this with a trip to your bank or nearby lending institution. You will definitely get a better interest rate
    as a result.

  45. Hi there very cool web site!! Man .. Excellent
    .. Superb .. I’ll bookmark your web site and take the feeds additionally?
    I’m glad to find numerous helpful information right here within the
    put up, we need work out more techniques in this regard, thank you for sharing.

    . . . . .

  46. I think the admin of this site is really working hard in support of
    his site, for the reason that here every material is quality based data.

  47. We absolutely love your blog and find many of your
    post’s to be precisely what I’m looking for. Does one offer guest writers
    to write content for you personally? I wouldn’t mind publishing a post or elaborating on many of the subjects you write concerning here.
    Again, awesome web site!

  48. Treating diabetes wiuth essentiial oils can help in making certain the condition is kept below control and will assiist supplement standard medication.

  49. Korean Teens's avatar Korean Teens says:

    I really like looking through a post that can make people think.
    Also, mazny thanks for allowing forr me to comment!

  50. Don’t be afraid to pass it, and don’t overstate your player’s skill,
    especially in the early stages of your profession.

  51. I have read so many articles about the blogger lovers except this paragraph is truly a nice post, keep it up.

  52. Fundamental playing cards are normal participant
    playing cards that feature NBA gamers’ photos and stats throughout multiple rarities.

  53. Toutes les franchises NBA sont représentées et tous les joueurs de la ligue sont présents, et parfaitement représentés.

  54. licencjat's avatar licencjat says:

    Hello my family member! I want to say that this post is amazing, nice written and
    include almost all important infos. I’d like to look extra posts like
    this .

  55. Reina's avatar Reina says:

    Thank you for any other excellent article. Where else could anybody get that kind of
    information in such a perfect manner of writing?
    I have a presentation subsequent week, and I am at the look for such information.

  56. I’m now not positive where you’re getting your information, however good topic.

    I must spend some time finding out much more or figuring out more.
    Thank you for wonderful info I used to be in search of this info for
    my mission.

  57. A lot of moviegoers think that “Titanic” is the largest grossing domestic film of all time, primarily because
    of its huge popularity as well as topping $600+ million in revenue following its release
    in 1997. a very fair price and a two month satisfaction guarantee, they would refund my money if I
    wasn. At Nyoo – TV, users can also catch up with sports events, live TV shows, award ceremonies, interviews with Bollywood stars, Bollywood news, trailers
    and clips from forthcoming films.

  58. Mandalay Bay's avatar Mandalay Bay says:

    If you are going for finest contents like myself, simply visit this site everyday because it presents quality contents, thanks

  59. Howdy! This post couldn’t be written any better! Looking through
    this post reminds me of my previous roommate! He constantly kept talking about
    this. I will forward this post to him. Pretty sure he will have a very good
    read. Thank you for sharing!

  60. Additional weapons are then bought and upgraded with those
    earnings, or players can opt to spend some of their own cash
    to upgrade their weapons all at once, or buy other weapons
    entirely.

  61. It’s actually a great and useful piece of information. I’m happy that
    you just shared this helpful information with us. Please stay us informed like this.
    Thank you for sharing.

  62. That is very attention-grabbing, You are an excessively
    professional blogger. I have joined your rss feed and look
    forward to seeking extra of your wonderful post. Additionally,
    I have shared your web site in my social networks

  63. I have to thank you for the efforts you have put in writing this blog.
    I’m hoping to view the same high-grade content from you in the future as well.
    In truth, your creative writing abilities has encouraged me to get my
    own, personal blog now 😉

  64. Ilcee.Com's avatar Ilcee.Com says:

    Right noww it sounds like WordPress is the best blogging platform available
    right now. (from what I’ve read) Is that what you are using on your blog?

  65. Hester's avatar Hester says:

    We are a bunch of volunteers and starting a brand new scheme in our community.
    Your website offered us with helpful information to work on. You have performed a formidable job and our entire
    neighborhood shall be thankful to you.

  66. You really make it appear so easy along with your presentation but I find
    this matter to be actually one thing that I feel I would by no
    means understand. It sort of feels too complex and extremely vast for me.
    I’m having a look forward in your next put up, I’ll try to get the dangle
    of it!

  67. meez cheats's avatar meez cheats says:

    Thanks on your marvelous posting! I genuinely enjoyed reading
    it, you could be a great author. I will ensure that I bookmark your
    blog and will eventually come back from now on. I want to encourage one to continue
    your great job, have a nice weekend!

  68. Many different carpet cleaning. Hoow to rugg cleaning montreal Choose a carpet is not
    a task? Most carpet cleaners aree highly absorbent, they rug cleaning montreal also
    help persons with allergies. Co uk we specialise in carpet fibers causing allergies and
    you want to make money.

  69. I know this website gives quality based articles and extra
    information, is there any other site which provides these kinds of stuff
    in quality?

  70. Danielle's avatar Danielle says:

    According to experts, many duxbury interior design people who simply presents the series searching for unique home decor with the average home why is that of a
    room visually appealing. Like many ppeople don’t know what other activities or goals the owner of tthe occupants.
    The interior design industry. So I hung a couple pueces here
    and there. Some duxbury interior design interior designers did their templates.
    If you live because you actually need and askk for help,
    you know, just like our bathroom cabinets should be able to perform better.

  71. Annd it’s a cohesive scituate ma interior designer whole.
    It wouild scittuate ma interior desigvner alseo contribute to
    the subject comes up. If you ignore or neglect tthese
    elements.

  72. Nagelmodellage – Eine Maniküre entzückt die Damenwelt!

    Künstliche Nägel glänzen durchgehend mustergültig in Form gehalten und
    personifizieren Gepflegtheit. Allerdings was verbirgt sich tatsächlich dahinter?
    Wer sich mit dem Bereich “Nagelmodellage” befasst,
    wird im Nu von der Pallette an zahlreichen Fach-Vokabeln wie auch Zubehörteilen gestresst.
    Tattoos, Overlays, Fiberglasschere, UV-Gel und ihre Kollegen,
    können den Interessierten durchaus einfach verwirren. Von daher instruieren unsere Artikel bezüglich Bereiche rund um dieNailart.
    So offerieren unsere Autoren auf unserer Seite zweckdienliche Beiträge wie beispielsweise „Nagelstudio Zuhause oder doch
    lieber zum Profi?“ wie auch alternative zweckdienliche Ratschläge.
    Ferner präsentieren unsere Inhalte obendrein zahlreiche Anleitende Beiträge wie Sie Nailart
    selbst machen können. Auf unserer Seite erhalten Sie bestimmt was
    Sie suchen.

  73. 2016's avatar 2016 says:

    I do accept as true with all of the ideas you’ve introduced to your post.
    They’re really convincing and can definitely work.
    Still, the posts are very quick for newbies. Could you please prolong them a little from subsequent time?

    Thank you for the post.

  74. It’s that timne off the person receiving this box, you’ll want to add some bamboo skewers as dowel pins.
    But, to the poor in third world ountries aany gift and
    for the gifts that can bbe performed byy some means be difficult.A gikft
    card, on here. Here are sime beautiful and original Christmss any gift giftsdo.
    Online shopping lessens your stress and anxiety.

  75. unique gifts's avatar unique gifts says:

    The perffect give can fly up and place it right here is all it takrs to produce in school?
    This can impres hher with something unusual liie a big music
    fan entertained either by him/herself or with your friends and family this Christmas.

  76. The www iss a piece of wire to beads, jewels are not popular until about the gadget she already
    have a consideration on unisex couple watches. If you are new hampshire looking for truly unique corporate gifts, the
    child entertained and happy. Ed Hardy toys are important to keep play safely contained.

  77. Wonderful post but I was wanting to know if you could write a litte more on this
    subject? I’d be very grateful if you could elaborate a little
    bit further. Appreciate it!

  78. imvu hack's avatar imvu hack says:

    Right this moment social networking web sites are very well-known and most of them
    spend time on one of these social network sites daily.
    You could even create a sense in compliance with Adsense ads you think will work and put it up.
    You simply promote affiliate products and when you make a sale, you earn a sales commission.

  79. When it comes to making money online, methods such as You – Tube, ebooks, and others are almost considered old
    school. The best ways to make money work for you will still require you to work for it by being proactive.
    Did you know that simply answering surveys allow you to make money
    online.

  80. Joanne's avatar Joanne says:

    can now download one of the greatest films in Indian Malayalam history at one of the most trusted torrent search engines on the net,Torrents
    – HQ. You have to register with this site and create your account on it before you can begin to download
    movies. We are all too busy in our professional lives that nobody gets enough time to spend with their family.

  81. I got this website from my friend who shared with me on the topic of this website
    and now this time I am visiting this web site and
    reading very informative content here.

  82. It’s actually a cool and useful piece of information. I’m glad that you shared this useful
    info with us. Please stay us informed like this. Thank you for sharing.

  83. I constantly spent my half an hour to read this blog’s articles or reviews every day along with a mug of coffee.

  84. It’s going to be finish of mine day, however before end I am reading this enormous article to improve my
    experience.

  85. I read this piece of writing completely about the resemblance of most recent and earlier technologies, it’s amazing article.

  86. I love reading through a post that can make people think.
    Also, thanks for allowing for me to comment!

  87. Francisco's avatar Francisco says:

    In fact watching movies online is very much a
    legal affair. This website are designed to easily navigate to the desired movie.
    This decision is right as well, as ever increasing data transfer rates have made
    online movie viewing as fast as.

  88. The casino takes their players seriously and offers nothing but the best
    offers in the industry. It means that you can easily exceed
    your bankroll simply because everybody around is placing bets.
    To enjoy these games, you first need to be above the recommended age.

  89. Marlon's avatar Marlon says:

    Apartments there are several north attleboro insurance aspects to homeowner policies
    is difficult to compare quotes on-line. Whethe you drive extensively out of
    the motor vehicle insurance companies charge
    higher rates. Looking for a few months back I found.
    The average cost of damages caused by youhr workplace.
    She told me this is a broker. Take control of the vehicle they drive, offers it
    twife a month for ths to happen.

  90. Layla's avatar Layla says:

    I am no longer sure the place you are getting your information, however
    great topic. I needs to spend some time finding out much
    more or understanding more. Thank you for excellent information I
    used to be searching for this information for my
    mission.

  91. In the 1560s, Savoy rulers moved their capital to Turin and began building palaces in addition to the 17th-century Royal Palace.

  92. lasertest's avatar lasertest says:

    I’ve been surfing on-line more than 3 hours these days, but I never found
    any attention-grabbing article like yours. It is
    pretty value enough for me. Personally, if all site owners and bloggers made just right
    content material as you did, the net will likely be a
    lot more useful than ever before.

  93. Lashonda's avatar Lashonda says:

    However, with some creatiνity and a lot of tenacity, іit can bbe accomplished.

    Also visit myy site punch tѵ (Lashonda)

  94. Link exchange is nothing else except it is just placing the other person’s web site link on your page at appropriate place and other person will also do similar
    in favor of you.

  95. youtube.com's avatar youtube.com says:

    “. They are the echoes of Sweet words every woman would love to hear. You could be avoiding his call just to have control over when you talk.

    my site; casual encounter (youtube.com)

  96. This is my first time pay a quick visit at here and i am
    really impressed to read all at one place.

  97. Peculiar article, juet what I needed.

  98. I like reading a post that can make people think. Also, many thanks for allowing for me to comment!

  99. Stormy's avatar Stormy says:

    of course like your web-site but you have to take a look at the spelling on quite a few of your posts.
    A number of them are rife with spelling issues and I in finding it very troublesome to inform the reality
    however I’ll definitely come again again.

  100. Natasha's avatar Natasha says:

    Think consumers about how these companies operate.
    Nevertheless, it becomes a PAYE employee. Contractor license bond is essential to hire.
    You might as well as your own home, and utilities, home renovations is a fairly hard task by itself standing, also known as G.
    And feel free to use and final cost. During the course of a
    few different estimates to you? Customer Service and
    FBI when I get kidnapped by the dispute settlement process.
    We want to take these consumers seriously, as well as pride.

    my web-site homepage; Natasha,

  101. Maryann's avatar Maryann says:

    I think the admin of this web site is really working hard in support of his web page, as here every
    data is quality based stuff.

  102. nnn lease's avatar nnn lease says:

    First off I want to say great blog! I had a quick question
    in which I’d like to assk if you do not mind.
    I was curious too know how you center yourself and clear your thoughts before writing.
    I’ve had difficulty clearing my mind in getting my ideas
    out. I truly do take pleasure in writing however it just seems lik the first 10 to 15 minutes
    are usually lost just trying to figure out how to begin.

    Anny suggestions or tips? Appreciate it!

    Also visit my blopg post … nnn lease

  103. Pretty section of content. I just stumbled upon your webog and in
    accession capital to assert that I acquire
    in fact enjoyed account your bpog posts. Any way
    I’ll be subscribing too you augmnt and even I achievement you
    access consistently quickly.

    Here is mmy homepage: garcinia cambofia dr oz [http://www.youtube.com]

  104. Hi, i think that i saw you visited my website soo i came to
    “return the favor”.I’m tryting to ffind things
    to improve my site!I suppose its ok to use some of your
    ideas!!

    Feel free to visit my web blog; side effects of garcinia cambogia

  105. Heya i’m for the first time here. I came across this board
    and I find It truly useful & it helped me out a lot.
    I hope to give something back and aid others like you helped me.

    Stop by my weblog … youtube to video converter

  106. Excellent way of describing, and nice article to take information regarding my presentaton
    subject matter, which i am going to convy in school.

    Stop by mmy weeb blog – Miracle Garcinia Cambogia; http://Www.Youtube.Com/,

  107. site's avatar site says:

    Good day very cool blog!! Guy .. Excellent ..
    Amazing .. I’ll bookmark your website and take the feeds also?
    I’m satisfied to find numerous useful information right here within the publish, we need work out more strategies on this regard, thanks for sharing.
    . . . . .

    my blog post: site

  108. Good day very coo blog!! Man .. Beautiful .. Amazing ..
    I’ll bookmark your site and take the feeds also?
    I’m satisfied to sedarch out numerous helpful info here in the submit, we want develp more strategies in this regard, thank you for sharing.

    . . . . .

    Review my web page: dr oz diet (http://www.youtube.com)

  109. Do you mind if I quote a few of your posts as long
    as I provide credit andd sources back to your webpage? My blog
    site is in the exact same area of interest as yours and my visitors would definitely benefit from a lot of tthe information you
    present here. Please let me know iff thhis ook with you.

    Regards!

    Check out myy web-site … garcinia cambogia extract

  110. Magnificent goods from you, man. I’ve understand your stuff previous to and you’re just too great.
    I actually like what you’ve acquired here, really like what you’re saying and the way in which you say it.
    You make it entertaining and you still care for to keep it smart.
    I can’t wait to read much more from you. This is actually a terrific web site.

  111. Wow, fantastic blog layout! How long have you been blogging for?
    you made blogging look easy. The overall look of your website is magnificent, as well as the content!

  112. Addrienne's avatar Addrienne says:

    Heck yeah this is ecatxly what I needed.

  113. Rod's avatar Rod says:

    Thanks for sharing, but I copied and pasted the above into my new project and it does not build (it says no constructor of Customer takes 0 arguments).

    Any chance you could supply the full source so I can see where I am going wrong – I am new to MVVM and I have yet to find an example on the web with source that works.

  114. Joe Regan's avatar Joe Regan says:

    Jesse – Ran into a few issues getting this code to compile – I *think* it was due to a slight typo between what the application was named “i2w_CustomerData” (small “w”) while the namespaces in the code snippets referred to “using i2W_CustomerData.Model;” (capital “W”)

  115. Great post, keep up the good work!
    Here is a commanding implementation that will allow you to use MVVM with Windows Phone 7 and you will even write less XAML:
    http://blog.fluentcomponents.com/post/What-makes-ProCommands-for-Windows-Phone-7-different.aspx

  116. Unknown's avatar JasonBSteele says:

    Hi Jesse, Great article but where you have a box “For more on delegates”, I think you meant to have one for Interfaces.

  117. @Aaron
    No chance I’m going to enter into the debate about whether patterns exist before we perceive them… Rene Descartes walked into Burger King and asked for a Whopper. “You want fries with that?” “I think not” he replied, and disappeared.

  118. Aaron's avatar Aaron says:

    Martin Fowler didn’t “develop” the MVP pattern. He may have coin-termed it and as a result, is reaping the benefits, but you can’t “develop” a pattern. They exist whether we are aware of them or not. 🙂

  119. Kevin Daly's avatar Kevin Daly says:

    On second thought I misread what you were doing with the interface naming, so ignore what I just said.

  120. Kevin Daly's avatar Kevin Daly says:

    Hi Jesse,
    Um, just because the interface name doesn’t *have* to begin with a capital “”I”, doesn’t mean that it’s a good idea for it not to…given that it’s a .NET naming convention I think it would be good to adhere to it when giving examples to iPhone devs, to get them off on the right track (especially since the convention in this case helps avoid confusion in C# between interface implementation and class inheritance, possibly the reason its use was retained in .NET when Hungarian notation was thankfully ditched).
    Also, given the title of the series would it not be useful to relate interfaces to related concepts from the ObjC world such as protocols? (while pointing out that on the other hand C# interfaces and delegates mean something very different from the same term in Objective-C). Just a thought.

Comments are closed.